Spring的四种实例化Bean方式和四种DI注入方式

11 篇文章 0 订阅

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值