IOC容器-Bean管理XML方式(8-18)
IOC操作Bean管理(FactoryBean)
1.Spring有两种类型bean,一种普通bean,另一种工厂bean(FactoryBean)
2.普通bean:在配置文件中定义bean类型就是返回类型
3.工厂bean:在配置文件定义bean类型可以和返回类型不一样
步骤:
创建类,让这个类作为工厂bean,实现接口FactoryBean
实现接口里面的方法,在实现的方法中定义返回的bean类型(定义类型跟返回类型可不一致)
public class MyBean implements FactoryBean<Course> { //定义返回bean @Override public Course getObject() throws Exception { Course course = new Course(); course.setCname("abc"); return course; } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { return FactoryBean.super.isSingleton(); } }
<bean id="MyBean" class="com.atguigu.spring5.factorybean.MyBean"> </bean>
@Test public void TestCollection(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans3.xml");//解析xml Course book = context.getBean("MyBean", Course.class);//获取对象 //book.test();//输出 //普通bean System.out.println(book);//com.atguigu.spring5.factorybean.MyBean@27f723 }
IOC操作Bean管理(bean作用域)
1.在Spring里面,设置创建bean实例是单实例还是多实例
2.在Spring里面,默认情况下,bean是单实例

3.如果设置单实例还是多实例
1.在spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例
2.scope属性值
第一个值:默认值 singleton,表示是单实例对象
第二个值:prototype,表示是多实例对象

3.单实例 和 多实例区别
设置单实例,在加载spring配置文件就会创建单实例对象
设置多实例,不会在加载spring配置文件时候创建对象,在调用getBean方法时候会创建多实例对象
IOC操作Bean管理(bean生命周期)
1.生命周期
1.从对象创建到对象销毁的的过程
2.bean生命周期
1.通过构造器创建bean实例(无参数构造)
2.为bean的属性设置值和对其他bean引用(调用set方法)
把bean实例传递bean后置处理器的方法
3.调用bean的初始化的方法(需要进行配置)
把bean实例传递bean后置处理器的方法
4.bean可以使用(对象获取到了)
5.当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
public class Orders { private String oname; public Orders() { System.out.println("第一步 第一步无参构造创建bean实例"); } public void setOname(String oname) { this.oname = oname; System.out.println("第二步 调用set方法设置属性值"); } //创建执行的初始化的方法 public void initMethod(){ System.out.println("第三步 执行初始化方法"); } //创建销毁方法 public void destroyMethod(){ System.out.println("第五步 执行销毁方法"); } }
<!-- bean生命周期 init-method:调用方法 destroy-method: --> <bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <property name="oname" value="手机"/> </bean>
@Test public void TestCollection3(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans4.xml");//解析xml Orders orders = context.getBean("orders", Orders.class);//获取对象 System.out.println("第四步 获取到bean对象"); System.out.println(orders); //手动让bean销毁 context.close(); }
4.bean的后置处理器,bean生命周期有七步
创建类,实现接口 ,创建后置处理器
public class MyBeanPost implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("初始化执行的方法"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("在初始化之后执行的方法"); return bean; } }
<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <property name="oname" value="手机"/> </bean> <!-- 配置后置处理器 --> <bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"> </bean>
IOC操作Bean管理(xml自动装配)
1.什么是自动装配
根据指定装配规则(属性名称或者属性类型)Spring自动将匹配的属性值进行注入
IOC操作Bean管理(基于注解方式)
1.什么是注解
注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值...)
使用注解,注解作用在类上面,方法上面,属性上面
使用注解目的:简化xml配置
2.Spring针对Bean管理中创建对象提供注解
@Component:spring中提供的普通注解
@Service:用于业务逻辑层
@Controller:web层控制层
@Repository:持久层
功能都一致,都可以用来创建bean实例
3.基于注解方式实现对象创建
第一步:引入依赖

第二步:开启组件扫描
<?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:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/util-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 扫描组件 如果扫描多个包,多个包使用逗号隔开 --> <context:component-scan base-package="com.atguigu"/> </beans>
第三步:创建类,在类上面添加创建对象注解

进行测试

4.开启组件扫描细节配置

5.基于注解方式实现属性注入
1.@Autowired:根据属性类型进行自动配置

2.@Qualifer:根据属性名称进行注入
3.@Resource:可以根据类型注入,也可以根据名称注入
4.@Value:注入普通类型属性
6.完全注解开发
1.创建配置类,替代xml配置文件
@Configuration //作为配置类,替代xml配置文件 @ComponentScan(basePackages = {"com.atguigu"}) public class SpringConfig { }
2.编写测试类
@Test public void TestUserService2(){ //加载配置类 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean("userService", UserService.class);//获取对象 System.out.println(userService); userService.add(); }

浙公网安备 33010602011771号