**
spring对bean的管理细节
1、创建bean的三种方式
2、bean对象的作用范围
3、bean对象的声明周期
创建对象的三种方式
1、使用默认构造函数创建
在spring配置文件中使用bean标签,配以id和class属性
使用的时默认构造函数,此时若对应类中没有默认构造函数,则对象无法创建
<bean id="accountService" class="com.zz.service.impl.AccountServiceImpl"></bean>
2、使用普通工厂中的方法创建对象(使用工厂类中的方法创建对象,并存入spring容器中)
首先创建factory包,并在包中创建InstanceFactory类,在此类中定义一个方法(任意,我使用的是getAccountService()方法),此方法返回类型是AccountService,在此方法中返回值是一个AccountService对象
<bean id="instanceFactory" class="com.zz.factory.InstanceFactory"></bean>
<bean id="accountService" fatory-bean="instanceFactory" factory-method="getAccountService"></bean>
3、使用工厂中的静态方法创建对象(使用工厂类中的静态方法创建对象,并存入spring容器中)
首先在factory包中创建一个StaticFactory类,在类中创建一个静态方法getAccountService() ,此方法返回值类型是AccountService,在此方法中返回值是一个AccountService对象
<bean id="accountService" class="com.zz.factory.StaticFactory" factory-method="getAccountService"></bean>
bean标签的scope属性
用于指定bean的作用范围的
取值;
singleton:单例的(默认的)
prototype:多例的
request:作用于web的请求范围
session:作用于web的会话范围
global-session:作用于群体环境的会话范围(全局会话范围),当不是群体环境时,他就是session
spring的依赖注入(Dependenty Injection)
**
IOC的作用:
降低程序间的耦合性(依赖关系)
依赖关系的管理:交给spring来维护
当前类用到的其他类中的对象,由spring提供,我们只需在配置文件中声明即可
依赖关系的维护称之为依赖注入
能注入的数据有三种:
基本类型和String
其他bean类型(在配置文件中或者注解过的bean)
复杂类型/集合类型
注入的三种方式:
构造函数提供
使用set方法提供
使用注解提供
1、构造函数注入
使用的标签:constructor-arg
标签出现的位置:bean标签的内部
标签中的属性:
type:用于指定要注入的数据的数据类型,该数据类型也是某个或某些参数的类型
index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值,索引的位置从0开始
name:用于指定给构造函数中指定名称的参数赋值
value:用于提供基本数据类型和String类型的数据
ref:用于指定其他bena类型的数据,他指的是spring的IOC核心容器中出现过的bean对象
优势:在获取bean对象时,注入数据是必须操作的,否则对象无法被创建
弊端:改变bean对象的实例方式,使我们在创建对象时,如果用不到这些数据,也必须提供
//type和value使用
<bean id="accountService" class="com.zz.service.impl.AccountServiceImpl">
<constructor-arg type="java.lang.String" value="aaa"><constructor-arg>
</bean>
//name和value使用
<bean id="accountService" class="com.zz.service.impl.AccountServiceImpl">
<constructor-arg name="name" value="aaa"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean name="now" class="java.util.Date"></bean>
2、set方法注入
涉及标签:property
出现的位置:bean标签内部
标签的属性:
name:用于指定注入时所调用的set方法名称
value:用于指定其他bean类型的数据。指的时spring的IOC核心类中出现过的bean对象
优势:创建对象时没有明确的限制,可以直接使用默认构造方法
弊端:如果某个成员必须有值,则set方法无法保证一定注入
<bean id="accountService" class="com.zz.service.impl.AccountServiceImpl">
<property name="name" value="aaa"></property>
<property name="age" value="21"></prioperty>
<property name="birthday" ref="now"></property>
</bean>
<bean id="now" class="java.util.Date"></bean>
3、复杂类型的注入/集合类型的注入
public class AccountServiceImpl implements IAccountService {
private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps;
public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public void setMyProps(Properties myProps) {
this.myProps = myProps;
}
@Override
public void saveAccount() {
System.out.println(Arrays.toString(myStrs));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps);
}
}
<bean id="accountService" class="com.qst.service.AccountServiceInpl">
<property name="myStrs">
<array>
<value>AAA</value>
<value>BBB</value>
</array>
</property>
<property name="myList">
<list>
<value>AAA</value>
<value>BBB</value>
</list>
</property>
<property name="mySet">
<set>
<value>AAA</value>
<value>BBB</value>
</set>
</property>
<property name="myList">
<list>
<value>AAA</value>
<value>BBB</value>
</list>
</property>
<property>
<map>
<entry key="testC" value="CCC"></entry>
<entry key="testD">
<value>DDD<value>
</entry>
</map>
</property>
<property>
<props>
<prop key="testE">EEE</prop>
<prop key="testF">FFF</prop>
</props>
</property>
</bean>
最后创建一个客户端类,用于检测
//通过反射使对象ac与bean.xml建立联系
ApplicationContext ac=new ClassPathXMLApplicationContext("bean.xml");
//通过ac的getBean()方法获取bean.xml文件中id为accountService的对象,并把对象赋给as
IAccountService ac=(IAccountService)as.getBean("accountService");
//调用as的saveAccount()方法
as.saveAccount();
注解:
注解使用前提:添加命名空间,让spring扫描含有注解的类
组件扫描:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
!!xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-组件扫描,扫描含有注解的类->
<context:component-scan base-package="com.zz.z_annotation"></context:component-scan>
</beans>
schema命名空间:
1、命名空间声明
默认:xmlns=""
显示:xmlns:别名=“名称”
2、确定schema文件位置
xsi:schemaLocation=“名称 位置”
注解相当于一个类,可以自己创建
开发中使用使用注解,取代xml配置文件
Componet:把当前对象存入到spring容器中
@Component取代
@Component(“id”)取代
web开发,提供3个@Component衍生注解,取代的仍然是,只有@Controller(“id”)才相当于
作用和属性和Componet是一模一样,是spring框架为我们明确提供三层使用
他们三个是spring框架为我们提供明确的三层使用的注解:
Controller:一般用在表现层
Service:一般用在服务层
Respository:一般用在持久层
依赖注入(可以给私有字段设置,也可以给setter方法设置):
普通值:@Value("")
引用值:
方式1:按照**类型**注入@Autowired:
相当于<bean id="A" class=""></bean>
<bean id="B" class="">
<property name="baoma">
<ref bean="A"></ref>
</property>
</bean>
自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入
如果IOC容器中没有任何bean类型和要注入的变量类型匹配,则报错
出现位置:可以是方法上也可以是变量上
方式2:按照**名称**注入:
(1)、@Autowired
@Quqalifier("名称"):(不能独立使用,要和Autowired配合)
作用:在按照类注入的标准的基础上再按照名称注入,他在给类成员注入时不能单独使用,但是再给方法注入时可以
如: @Autowired
@Quqalifier("accountDao")
(2)、@Rresource("名称"):
作用:直接按照bean的id注入,可以单独使用
Resource(name="accountDao")
生命周期:
初始化:@PostConstruct
销毁: @PreDestroy
作用域:
@Service("userServiceId")
@Scope("prototype")多例