Bean标签的属性说明
<bean>标签:用于声明一个类,在启动Spring框架的时候根据该配置的类创建对象到容器里面
name:设置对象名(唯一标识符),可以有多个名称,每个名称用逗号隔开 : name1,name2
id:设置对象名(唯一标识符,功能和name一样)
class:用于指定对象对应的类名
scope:用于设置的对象的作用范围,可选参数如下:
*singleton:单例(默认)
对象出生:当程序加载配置文件创建容器时,创建
对象活着:只要容器还在,一直活着
对象死亡:应用停止,容器销毁,对象死亡
*prototype:多例(原型对象)
对象出生:当程序加载配置文件创建容器时,创建
对象活着:只要对象被使用,一直活着
对象死亡:对象长时间不用,会被Java垃圾回收机制回收
*reqeust:web项目中,Spring将创建的对象放在request作用域中
*session:web项目中,Spring将创建的对象放在session作用域中
*globalSession:web项目中,应用域portlet环境,如果没有protlet环境相当于session
init-method:设置创建对象的时候,调用初始化方法
destroy-method:设置对象被回收时,调用注销的方法
一、实例化Bean的四种方式
1.1构造器实例化(无参数构造器),最标准,使用最多。
public class SomeBean1 {
public SomeBean1() {
System.out.println("SomeBean.SomeBean1()");
}
}
-------------------配置文件--------------------------
<!-- ①.构造器实例化(无参数构造器),最标准,使用最多。 -->
<bean id="someBean1" class="com.ywq.spring.pojo.SomeBean1"></bean>
1.2.通过静态方法工厂创建
-------------------SomeBean2/SomeBean2Facotry -------------------
public class SomeBean2 {
public SomeBean2() {
System.out.println("SomeBean.SomeBean2()");
}
}
public class SomeBean2Facotry {
//静态工厂方法
public static SomeBean2 getSomeBean2() {
System.out.println("执行静态工厂方法");
return new SomeBean2();
}
}
-------------------静态工厂配置--------------------------
<!-- ②.静态工厂方法实例化:解决系统遗留问题 -->
<bean id="someBean2" class="com.ywq.spring.pojo.SomeBean2Facotry"
factory-method="getSomeBean2"></bean>
1.3通过实体工厂创建
-------------------SomeBean3 /SomeBean3Facotry --------------------------
public class SomeBean3 {
public SomeBean3() {
System.out.println("SomeBean.SomeBean3()");
}
}
public class SomeBean3Facotry {
//实例工厂方法
public SomeBean3 getSomeBean3() {
System.out.println("执行实例工厂方法");
return new SomeBean3();
}
}
-------------------配置文件--------------------------
<!-- ③.实例工厂方法实例化:解决系统遗留问题 -->
<!-- 1.配置工厂bean -->
<bean id="someBean3Factory" class="com.ywq.spring.pojo.SomeBean3Facotry"></bean>
<!-- 2.配置bena
factory-bean : 创建bean的工厂对象对应的 id
factory-method : 工厂bean中返回 bean对象的方法
-->
<bean id="someBean3" factory-bean="someBean3Factory" factory-method="getSomeBean3"/>
1.4实现FactoryBean接口实例化:实例工厂变种
实现FactoryBean接口,MyBatis和Spring集成就是使用的这种方式
此种方式,如果没有使用Bean对应的对象,Spring就不会自动创建,只有在使用的时候Spring才会创建对应的对象
-------------------SomeBean4 /SomeBean4ObjectFactory --------------------------
public class SomeBean4 {
public SomeBean4() {
System.out.println("SomeBean4.SomeBean4()");
}
}
public class SomeBean4ObjectFactory implements FactoryBean<SomeBean4>{
//返回的泛型类型对应的对象
@Override
public SomeBean4 getObject() throws Exception {
SomeBean4 bean4 = new SomeBean4();
return bean4;
}
@Override
public Class<?> getObjectType() {
return null;
}
}
-------------------配置文件--------------------------
<!-- ④.实现FactoryBean接口实例化:实例工厂变种:集成其他框架使用:LocalSessionFactoryBean -->
<bean id="someBean4" class="com.ywq.domian.SomeBean4ObjectFactory"></bean>
二、Spring依赖注入DI的四种方式
2.1.setter注入,(属性注入)
1.setter注入,(也可以称之为属性注入)
使用setter注入:
1,使用bean元素的子元素设置;
1,简单类型值,直接使用value赋值;
2,引用类型,使用ref赋值;
3,集合类型,直接使用对应的集合类型元素即可。
2,spring通过属性的setter方法注入值;
3,在配置文件中配置的值都是string,spring可以自动的完成类型的转换
------------------------员工类-------------------------
public class Employee {
private Integer age;
private String name;
private Department dept;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Employee [age=" + age + ", name=" + name + ", dept=" + dept + "]";
}
}
------------------------部门类-------------------------
public class Department {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
--------------------------xml配置文件----------------------------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 员工 -->
<bean id="employee" class="com.ywq.spring.pojo.Employee" >
<!-- setter方法注入: 属性注入
<property name="" value="">
name : 属性名称
value : 基本数据类型+String类型的值注入
ref : 引用类型(对象类型)的注入
value 和ref 只能二选一
-->
<property name="age" value="18"></property>
<property name="name" value="jinken"></property>
<property name="dept" ref="dept"></property>
</bean>
<!-- 部门 -->
<bean id="dept" class="com.ywq.spring.pojo.Department" ></bean>
</beans>
2.2.构造器注入
1,默认情况下,constructor-arg的顺序就是构造器参数的顺序
2,3中调整构造器顺序:
1.index:在构造器中的参数索引(从0开始)
2.type:在构造器中的参数的类型
3.name:在构造器中按照构造器的参数名字设置值
====================
使用哪种注入方式比较好(setter?构造器?)?
1,如果一个类必须依赖另一个类才能正常运行,用构造器;
2,但是构造器的参数如果过多,构造器很难看;–测试参数不能少,否则报错20191221
3,更多的还是使用setter注入;
4,可以使用@Required标签来要求一个属性必须注入
--------------构造器注入xml配置-----------------
<!-- 员工 -->
<bean id="employee" class="com.ywq.spring.pojo.Employee" >
<!-- constructor注入 -->
<constructor-arg index="1" value="乔峰"/>
<constructor-arg index="0" value="19"/>
<constructor-arg ref="dept"/>
</bean>
<!-- 部门 -->
<bean id="dept" class="com.ywq.spring.pojo.Department" ></bean>
2.3.p命名空间注入
使用p命名空间注入先在约束上面引入 p标签
--------------p命名空间注入xml配置-----------------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置部门 -->
<bean id="department" class="com.ywq.spring.pojo.Department"
p:id="123"
p:name="销售部"/>
<!-- 配置员工 -->
<bean id="emp" class="com.ywq.spring.pojo.Employee"
p:id="111"
p:name="西门吹雪"
p:dept-ref="department"/>
</beans>
2.4.集合类型值注入
在处理的数据中,
有标量/值类型=基础数据类型以及包装类+String – value属性
也有Spring容器里面的对象 --ref属性
还要很多数据JDK内置的数据结构:
1.键值对 Map 、Properties
2.数组
3.集合Set、List
----------------Bean类-------------------
public class CollectionBean {
private Set<String> set;
private List<String> list;
private String[] array;
private Map<String, String> map;
private Properties prop; //读取本地 xxx.properties文件(本质就是一个Map集合)
}
------------------xml配置文件-----------------
<bean id="collectionBean" class="cn.gzxst.spring.pojo.CollectionBean">
<!-- set集合注入 -->
<property name="set">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property>
<!-- list集合注入 -->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
<value>list3</value>
</list>
</property>
<!-- 数组注入 -->
<property name="array">
<array>
<value>AA</value>
<value>BB</value>
<value>CC</value>
</array>
</property>
<!-- map集合注入 -->
<property name="map">
<map>
<entry key="key1" value="乔峰"/>
<entry key="key2" value="虚竹"/>
<entry key="key3" value="段誉"/>
</map>
</property>
<!-- Properties注入 -->
<property name="prop">
<props>
<prop key="pro1">proVlaue1</prop>
<prop key="pro2">proVlaue2</prop>
<prop key="pro3">proVlaue3</prop>
</props>
</property>
</bean>