02_Spring Bean的装配模式_基于XML配置方式
一.三种实例化Bean的方式
1.使用类构造器实例化(默认无参数)
<bean id="bean1" class="com.demo1.Bean1"></bean>
2.使用静态工厂方法实例化(简单工厂模式)静态方法
<bean id="bean2" class="com.demo2.Bean2Factory" factory-method="getBean2"></bean>
<!--需要创建一个UserFactroy类-->
public class Bean2Factory{
public static Bean2 getBean2(){
return new Bean2();
}}
3.使用实例工厂方法实例化(工厂方法模式)非静态方法
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="com.demo2.Bean3Factory"/>
public class Bean3Factory{
public Bean3 getBean3(){
return new Bean3();
}
}
在applicationContext.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- bean对象创建
1.无参构造
-->
<bean name="user" class="com.bean.User">
</bean>
<bean name="address" class="com.bean.Address">
</bean>
<!-- bean对象创建
2.静态工厂方法(不常用)
-->
<bean name="user1" class="com.bean.UserFactory" factory-method="createUser">
</bean>
<!-- bean对象创建
3.工厂方法L:非静态(不常用)
-->
<bean name="user2" factory-method="createUser1" factory-bean="factorybean">
</bean>
<bean name="factorybean" class="com.bean.UserFactory">
</bean>
</beans>
如果要使用工厂方法配置bean,而后要配置一个UserFactory.java对象
package com.bean;
/**
* Created by jiatp
*/
public class UserFactory {
public static User createUser(){
System.out.println("静态方法创建");
return new User();
}
public User createUser1(){
System.out.println("非静态方法");
return new User();
}
}
Bean的命名,id属性和name属性:
一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称
id 属性在IoC容器中必须是唯一的
id 的命名要满足XML对ID属性命名规范
必须以字母开始,可以使用字母、数字、连字符、下划线、冒号
如果Bean的名称中含有特殊字符,就需要使用name属性
例如:
<bean name="#person" class="com.bean.Person"/>
因为name属性可以相同,所以后出现Bean会覆盖之前出现的同名的Bean
Bean的作用域:
scope属性 :
* singleton:单例的.(默认的值.)
* prototype:多例的.
* request:web开发中.创建了一个对象,将这个对象存入request范围,request.setAttribute();
* session:web开发中.创建了一个对象,将这个对象存入session范围,session.setAttribute();
* globalSession:一般用于Porlet应用环境.指的是分布式开发.不是porlet环境,globalSession等同于session;
实际开发中主要使用singleton,prototype
<bean id="customer" class="com.demo3.Customer" scope="prototype"></bean>
Spring容器中Bean的生命周期:
1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware 执行 setBeanName
4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean 执行 afterPropertiesSet
7.调用<bean init-method="init"> 指定初始化方法 init
8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
9.执行业务处理
10.如果Bean实现 DisposableBean 执行 destroy
11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy
二.依赖注入Bean的属性
代码实现:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 对象注入 -->
<!--
1) set方式注入
基本数据类型 : (8种)
引用数据类型 : 包含类类型的属性
-->
<bean name="user" class="com.bean.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
<property name="address" ref="address"></property>
</bean>
<bean name="address" class="com.bean.Address">
<property name="city" value="北京"></property>
<property name="street" value="王府井"></property>
</bean>
<!--
2)构造方法注入
-->
<bean name="user1" class="com.bean.User">
<!-- constructor-arg
name属性:参数的名称
value属性:参数的值
ref属性:引用的bean对象
index属性:说明参数位置 index="0"
type属性: 参数的类型 type="java.lang.String"
-->
<constructor-arg name="name" value="abc" type="java.lang.String"></constructor-arg>
<constructor-arg name="age" value="20" type="java.lang.Integer"></constructor-arg>
<constructor-arg name="address" ref="address"></constructor-arg>
</bean>
<!--
3) p名称注入(了解)
-->
<bean name="user3" class="com.bean.User"
p:name="张三" p:age="10" p:address-ref="address">
</bean>
<!--
4) spel 注入 spring Expression language string 表达式语言
-->
<bean name="user4" class="com.bean.User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user3.age}"></property>
<property name="address" ref="address"></property>
</bean>
</beans>
1) set方式注入 :
基本数据类型 : (8种)
引用数据类型 : 包含类类型的属性
使用set方法注入,在Spring配置文件中,通过<property>设置注入的属性,<property>标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象,(ref中可引入其它bean名称)
2)构造方法注入 :
<constructor-arg name="name" value="李四" type="java.lang.String"></constructor-arg>
name属性:参数的名称
value属性:参数的值
ref属性:引用的bean对象
index属性:说明参数位置 index="0"
type属性: 参数的类型 type="java.lang.String"
3) p名称注入
使用p命名空间
为了简化XML文件配置,Spring从2.5开始引入一个新的p名称空间
p:<属性名>="xxx" 引入常量值
p:<属性名>-ref="xxx" 引用其它Bean对象
引入名称空间:xmlns:p="http://www.springframework.org/schema/p"
<bean name="user2" class="com.bean.User" p:name="p注入" p:age="12" p:address-ref="addresss">
4) SpEL 注入 spring Expression language string 表达式语言
语法:#{表达式}
<bean id="" value="#{表达式}">
<SpEL表达式语言
语法:#{}
#{'神回复:哈哈'}使用字符串
#{topicId3} 使用另一个bean
#{topicId4.content.toUpperCase()} 使用指定名属性,并使用方法
#{T(java.lang.Math).PI} 使用静态字段或方法
依赖注入:
应用:三层结构(控制层-业务层-数据层)
控制层依赖业务层(在控制层类中注入业务层对象)
业务层依赖数据层(在业务层类中注入数据层对象)
注入:
1.注入<constructor-arg> 成员变量赋值通过构造
2.注入<property> 成员变量赋值通过set方法
三.集合类型属性的注入
1.新建CollectionBean.java
package com.collection;
import java.util.*;
/**
* Created by jiatp
*/
public class CollectionBean {
private Object[] arr;//数组注入
private List list;//list注入
private Map map;//map注入
private Properties prop;//properties注入
private Set<String> sets;//set注入
public Object[] getArr() {
return arr;
}
public void setArr(Object[] arr) {
this.arr = arr;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProp() {
return prop;
}
public void setProp(Properties prop) {
this.prop = prop;
}
@Override
public String toString() {
return "CollectionBean{" + "arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop + ", set=" + sets + '}';
}
}
applicationContext.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<bean name="user" class="com.icss.bean.User">
<property name="name" value="李四"/>
</bean>
<!--1.数组注入-->
<bean name="cb" class="com.collection.CollectionBean">
<property name="arr">
<array>
<value>tom</value>
<value>jack</value>
<ref bean="user"/>
</array>
</property>
<!--2.list注入-->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property>
<!--3.map注入-->
<property name="map">
<map>
<entry key="url" value="jdbc:mysql://crm"/>
<entry key="user" value-ref="user"/>
</map>
</property>
<!--4.set注入-->
<property name="sets">
<set>
<value>zhansan</value>
<value>lisi</value>
</set>
</property>
<!--5.properties注入-->
<property name="prop">
<props>
<prop key="driverclass" >com.jdbc.mysql.Driver</prop>
<prop key="url" >jdbc:mysql:///crm</prop>
<prop key="username" >root</prop>
<prop key="password" >123456</prop>
</props>
</property>
</bean>
</beans>
使用多个xml配置文件
方式一 可以在创建ApplicationContext对象时传入多个配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");
方式二 可以在配置文件中通过<import>引入其他配置文件
import resource="classpath:bean2.xml"/>
02_Spring Bean的装配模式_基于XML配置方式的更多相关文章
- 03_Spring Bean的装配模式_基于Annotation配置方式
前言 在Spring中尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中Bean的数量较多,会导致XML配置文件过于臃肿,从而给维护和升级带来一定的困难.从JDK 5开始提供了名为Anno ...
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析 本文简要介绍了基于 Spring 的 web project 的启动流程,详细分析了 Spring 框架将开发人员基于 XML ...
- struts_20_对Action中所有方法、某一个方法进行输入校验(基于XML配置方式实现输入校验)
第01步:导包 第02步:配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...
- struts2视频学习笔记 22-23(基于XML配置方式实现对action的所有方法及部分方法进行校验)
课时22 基于XML配置方式实现对action的所有方法进行校验 使用基于XML配置方式实现输入校验时,Action也需要继承ActionSupport,并且提供校验文件,校验文件和action类 ...
- 转载 - Struts2基于XML配置方式实现对action的所有方法进行输入校验
出处:http://www.cnblogs.com/Laupaul/archive/2012/03/15/2398360.html http://www.blogjava.net/focusJ/arc ...
- Bean的基于XML配置方式
基于XML配置 Beans.xml <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns= ...
- ssm整合(基于xml配置方式)
本文是基于xml配置的方式来整合SpringMVC.Spring和Mybatis(基于注解的方式会再写一篇文章),步骤如下: (1)首先自然是依赖包的配置文件 pom.xml <project ...
- Spring IOC容器装配Bean_基于XML配置方式
开发所需jar包 实例化Bean的四种方式 1.无参数构造器 (最常用) <?xml version="1.0" encoding="UTF-8"?> ...
- Spring 基于xml配置方式的事务
参考前面的声明式事务的例子:http://www.cnblogs.com/caoyc/p/5632198.html 我们做了相应的修改.在dao中和service中的各个类中,去掉所有注解标签.然后为 ...
随机推荐
- java 一维数组的输出方式
1.使用传统的for()循环输出: //定义一个数组 int []array = {1,2,3,4,5}; for(int i=0;i<array.length;i++) { System.ou ...
- apache的目录浏览功能 列出的文件名不完整,能否修改设置
在httpd.conf 和 httpd-vhosts.conf中的 <Directory ????> </Directory>如下设置,重启apache即可: <Dir ...
- JS对象 返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数 一小时为:60*60*1000
返回/设置时间方法 get/setTime() 返回/设置时间,单位毫秒数,计算从 1970 年 1 月 1 日零时到日期对象所指的日期的毫秒数. 如果将目前日期对象的时间推迟1小时,代码如下: &l ...
- JS对象 JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。
什么是对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方法: ...
- TFS 忽略 文件
原文链接:http://ju.outofmemory.cn/entry/258689 让TFS忽略packages文件夹的更改 很多时候我们需要使用 Nuget 进行包管理,这时在我们的解决方案文件夹 ...
- 【leetcode题目整理】数组中找子集
368. Largest Divisible Subset 题意:找到所有元素都不同的数组中满足以下规则的最大子集,规则为:子集中的任意两个元素a和b,满足a%b=0或者b%a=0. 解答:利用动态规 ...
- PHP算法之统计全为 1 的正方形子矩阵
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0 输出: 4 来源:力扣( ...
- 使用Element的upload上传组件,不使用action属性上传
1.需要实现的效果如下图,在点击提交的时候再提交file数据,和其他数据统一上传,我把file转换成了base64的格式,可以再上传之前显示缩略图 2.代码分析 action属性值为"#&q ...
- C/C++ Microsoft Visual Studio c++ DOC Home
{ // https://docs.microsoft.com/zh-cn/cpp/overview/visual-cpp-in-visual-studio?view=vs-2017 // https ...
- Vue+Iview+Node 登录demo
1.相关组件安装 axios iview js-cookie crypto-js 2.子父组件传值.监听窗体大小改变.记住密码 .自定义组件(事件 .props) created:实例已经创建完 ...