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();
    }

 

posted @ 2023-05-21 10:29  monkey大佬  阅读(19)  评论(0)    收藏  举报