IOC-Bean管理
什么是Bean管理
bean管理就是指的下面两个操作
1、Spring创建对象
2、Spring注入属性
Bena管理的操作有两种方式实现
1、基于XML配置文件方式实现
(1)基于xml创建对象
// 创建User类对象
<bean id="user" class="com.xn.User"></bean>
- 在Spring配置文件中,使用bean标签,标签中添加对应属性,即可实现xml创建对象
- Bena标签中一些常用的属性
- id:对象别名
- class:所需创建对象的类全路径
- 在创建Bean时,默认调用的类中的无参构造方法
(2)基于xml注入属性 - DI:依赖注入,就是注入属性
- set方法注入
//原始方式
private String name;
//ste方法注入
pubilc void setName(String name){
this.name = name;
}
//xml方式
//1、有对应属性以及相应的set方法
//创建对象
<bean id="user" class="com.xn.User">
//set注入属性
<property name="属性名称" value="属性值"></property>
</bean>
- 有参构造方法注入
//原始方式
private String name;
//构造方法注入
pubilc User(String name){
this.name = name;
}
//xml方式
//1、有对应属性以及相应的有参构造方法
//创建对象
<bean id="user" class="com.xn.User">
//有参构造方法注入属性
<constructor-arg name="构造参数名称" value="参数值"></constructor>
</bean>
* p命名空间注入,可以简化注入
//xml方式
//在xml文件表头添加如下属性
xmlns:p="http://www.springframework.org/schema/p"
//创建对象
<bean id="user" class="com.xn.User" p:属性名="值"></bean>
* 注入空值
//xml方式
//创建对象
<bean id="user" class="com.xn.User">
<property name="属性名称">
<null/>
</property>
</bean>
* 注入特殊符号
//xml方式
//创建对象
<bean id="user" class="com.xn.User">
//1、转义符
//2、特殊符号写到CDATA中
<property name="属性名称">
<value>
<![CDATA[带特殊符号的值]]>
</value>
</property>
</bean>
* 注入属性 - 外部bean
//1、创建dao接口以及实现类
//2、创建service接口以及实现类(调用dao)
public class UserService{
private UserDao dao;
public void setUserdao(UserDao dao){
this.dao = dao;
}
}
//xml方式
//创建对象
<bean id="userdao" class="com.xn.UserDao"></bean>
<bean id="userService" class="com.xn.UserService">
//注入属性 ref 绑定对象id,实现注入
<property name="dao" ref="userdao"/>
</bean>
* 注入属性 - 内部bean 和 级联赋值
//1、1对多的关系,类似员工和部门的关系
//xml方式
//创建对象
<bean id="emp" class="com.xn.Emp">
//1、可以使用ref的外部bean方式
//2、内部bean
<property name="dept">
<bean id="dept" class="com.xn.Dept">
......
</bean>
</property>
//3、级联赋值(1、引入外部bean方式实现)
//2、第二种方式:使用beanid点相应属性名称(需要相应属性的get方法)
<property name="depts" ref="defp"></bean>
<property name="depts.name" values="值"></property>
</bean>
<bean id="depts" class="com.xn.Dept"></bean>
* 注入集合类属性
<bean id="stu" class="com.xn.Student">
//1、注入数组类型属性
<property name="courses" >
<array>
<value>值</value>
<value>值</value>
</array>
</property>
//2、注入List类型属性
<property name="list" >
<list>
<value>值</value>
<value>值</value>
</list>
</property>
//3、注入Map类型属性
<property name="maps" >
<map>
<entry key="键" value="值"></entry>
<entry key="键" value="值"></entry>
</map>
</property>
//4、注入Set类型属性
<property name="sets" >
<set>
<value>值</value>
<value>值</value>
</set>
</property>
</bean>
//集合内设置对象类型
<bean id="stu" class="com.xn.Student">
<property name="list" >
<list>
<ref bean="外部对象id"></ref>
<ref bean="外部对象id"></ref>
</list>
</property>
</bean>
//集合内公共的地方提出来
1、在spring配置文件中引入util的命名空间,以及在xsi:schemaLocation中添加util
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd"
2、使用util标签提取集合标签
<util:list id="list">
<ref bean="外部bean对象"></ref>
<value>值</value>
</util:list>
3、注入list
<bean id="stu" class="com.xn.Student">
<property name="names" ref="list"></property>
</bean>
IOC操作Bean管理(FactoryBean)
- Spring有两种类型的bean,一种普通bean,一种工厂bean(FactoryBean)
- 普通bean:在配置文件中,定义的bean的类型就是返回类型
- 工厂bean:在配置文件中,定义的bean的类型可以和返回类型不一致
//实现步骤1:创建类,让这个类作为工厂bean,实现接口FactoryBean
public class MyBean implements FactoryBean{
//实现该接口的3个方法
//定义返回bean
@Override
public Object getObject() throws Exception{
//返回bean是什么类型由这个方法决定
return Object;
}
@Override
public Class<?> getObjectType() {
}
......
}
//实现步骤2:实现接口里面的方法,在实现的方法中定义返回的bean类型
bean的作用域
- 在spring中,设置创建Bean实例是单实例还是多实例
- 在spring中,默认情况下,bean的创建是单实例(即单一对象)
- 在spring中设置单实例和多实例是由bean标签中的scope属性值决定
- scope属性值
- 1、默认值,singleton ,表示的是单实例
- 2、prototype ,表示的是多实例对象
- 3、request,表示一次请求内
- 4、session,表示一次会话内
- singleton 和 prototype 区别:
- 1、一个是单实例,一个是多实例
- 2、设置值为 singleton 的时候,在加载spring配置文件时就会创建单实例对象,在设置值为prototype的时候,不是在加载spring配置文件的时候创建对象,而是在调用getBean方法的时候创建多实例对象
- scope属性值
bean的生命周期
- 生命周期
- 从对象创建到对象销毁的过程
- bean的生命周期
- 1、通过构造器创建bean实例(无参构造方法)
- 2、为bean的属性值和对其它bean引用(调用参数的set方法)
- 3、调用bean中的初始化的方法(需要进行配置)使用bean的init属性配置初始化方法
- 4、bean可以使用了
- 5、当容器关闭的时候,调用bean的销毁方法(需要配置销毁的方法)使用bean的destory属性配置销毁方法
- bena的后置处理器 (加上这两步一共有7步)
- 2-3之间有一步把bean实例传递给bean后置处理的方法
- 在3-4 直接有一步把bean实例传递给bean后置处理的方法
- 实现接口BeanPostProcessor,实现接口下的两个方法
- 配置后置处理器:在spring配置文件中添加后置处理器的bean对象
IOC操作Bean管理(xml自动装配)
- 1、什么是自动装配
- (1)根据指定的装配规则(属性名称或者属性类型),spring自动将匹配的属性值进行注入
- 2、自动装配的过程
- bean标签中有个属性autowire ,配置此属性后可以实现自动装配,此属性有两个常用的值:
- 1、byName ,根据名称进行自动匹配
- 2、byType ,根据类型进行自动匹配,只能有一个相同类型bean才能完成自动装配
- bean标签中有个属性autowire ,配置此属性后可以实现自动装配,此属性有两个常用的值:
IOC操作Bean管理(外部属性文件)
-
1、直接配置数据库信息
- (1)配置德鲁伊连接池
- (2)引入相关jar文件
- (3)直接在xml中配置
-
2、引入外部属性文件配置数据库连接池
-
新建外部属性文件properties文件
-
创建属性名称键值对
-
把外部的properties配置文件引入到Spring配置文件中(需要引入命名空间context)
-
xmlns:util="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
//引入外部配置文件
<context:property-placeholder location="classpath:jdbc.properties"/>
2、基于注解方式实现
- 什么是注解?
- 注解是代码特殊标记,格式:@注解名称(属性名称 = 属性值 …)
- 使用注解,可以作用在类、属性、方法上
- 目的:简化配置文件
Spring 针对 Bean 管理中创建对象提供的注解
- @Component
- @Service
- @Controller
- @Repository
- 上面4个注解功能一样,都可以用来创建Bean实例
基于注解方式实现对象创建
- 1、引入依赖(AOP 的jar文件)
- 2、在配置文件中开启组件扫描(用于扫描注解)
//引入context命名空间(参照上面的)
//开启组件扫描
<context:component-scan base-package="需要被扫描的包全路径"></context:component-scan>
//如果要扫描多个包,多个包之间用逗号隔开
- 3、创建类,在类上面添加创建对象的注解
- value值可以不写,默认为类名首字母小写
组件扫描的其它配置
注解方式实现属性注入
- 1、@AutoWired : 根据属性类型进行自动装配
- 2、@Qualifier :根据属性名称进行自动注入
- 3、@Respurce :根据属性类型或者属性名称进行自动注入
- 4、@Value :注入普通类型属性
* 其它注解方式一致
完全注解开发
- 1、创建配置类,替代xml配置文件