Spring5-IOC(二)

  1. IOC 操作Bean 管理(FactoryBean)

    1. Spring 有两种类型的bean,一种是普通bean 另一种是工厂bean(FactoryBean)

      • 普通bean 在配置文件中定义的bean类型就是返回类型

      • 工厂bean 在配置文件中定义的bean 类型可以和返回类型不一样

        • 创建类,让这个类作为工厂bean 实现接口FactoryBean

          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 false;
              }
          }
          
        • 实现接口里面的方法,在实现的方法中定义返回的bean类型

          <bean id="mybean" class="com.atguigu.spring5.factorybean.MyBean">
          
          </bean>
          
          @Test
          public  void testCollection3() {
              ApplicationContext context=new ClassPathXmlApplicationContext("bean3.xml");
          
          
              Course myBean = context.getBean("mybean", Course.class);
              System.out.println(myBean);
          }
          
  2. IOC 操作Bean的作用域

    • 在Spirng里面,设置创建bean实例是单实例还是多实例

    • 在Spring里面,默认情况下,bean是单实例

      @Test
      public  void testCollection2() {
          ApplicationContext context=new ClassPathXmlApplicationContext("bean2.xml");
      
      
          Book book = context.getBean("book", Book.class);
          Book book2 = context.getBean("book", Book.class);
          
          book.test();
          System.out.println("book = " + book);
          System.out.println("book2 = " + book2);
      
      }
      
      list = [java, php, MySql]
      book = com.atguigu.spring5.Book@727803de
      book2 = com.atguigu.spring5.Book@727803de
      
    • 如何设置单实例还是多实例

      • 在spirng配置文件bean标签里面有属性(scope)用户设置单实例还是多实例

        • scope 属性值

          1. 第一个默认值 singleton,表示单实例对象

          2. 第二值 prototype,表示是多实例对象

            <!--    2.提取list集合类型属性注入使用-->
                <bean id="book" class="com.atguigu.spring5.Book" scope="prototype">
                    <property name="list" ref="bookList">
                    </property>
                </bean>
            
    • singleton和prototype

      • singleton 单实例 prototype 多实例
      • 设置scope值是singleton时候,加载spring 配置文件就会创建单实例对象 设置scope值是prototype时候,不是在spiring配置文件时候创建对象,在调用getBean方法时候创建多实例对象
  3. IOC操作Bean的生命周期

    • 生命周期

      • 从对象创建到对象销毁的过程
    • bean 生命周期

      1. 通过构造器创建bean实例(无参数构造)
      2. 为bean 的属性设置值对其他bean 引用(调用set方法)
      3. 调用bean的初始化的方法(需要进行配置)
      4. bean 可以使用了(对象获取到了)
      5. 当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
    • 演示bean生命周期

          //无参数构造
      
      
          public Orders() {
              System.out.println("第一步,执行无参数构造创建bean实例");
          }
      
          private String oname;
      
          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 id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
          <property name="oname" value="手机" >
          </property>
      </bean>
      
      @Test
      public  void testCollection4() {
          ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");
      
      
          Orders orders = context.getBean("orders", Orders.class);
          System.out.println("orders = " + orders);
          System.out.println("第四步 获取创建bean实例对象");
      
          //手动让bean 销毁
          ((ClassPathXmlApplicationContext) context).close();
      }
      
      • bean的后置处理器,bean的生命周期有七步

        1. 通过构造器创建bean实例(无参数构造)

        2. 为bean 的属性设置值对其他bean 引用(调用set方法)

        3. 调用bean实例传递bean后置处理器方法

          postProcessBeforeInitialization
          
        4. 调用bean的初始化的方法(需要进行配置)

        5. 把bean实例传递bean后置处理器的方法

           postProcessAfterInitialization
          
        6. bean 可以使用了(对象获取到了)

        7. 当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)

      • 演示添加后置处理器效果

        (1) 创建类,实现接口BeanPostProcessor

  4. IOC 操作Bean管理(xml自动装配)

    1. 什么是自动装配

      (1) 根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入

    2. 演示自动装配

      (1) 根据属性名称注入,注入值bean的id值和类属性名称一样

      <!--实现自动装配
        bean标签属性autowire,配置自动装配
        autowire 属性常用两个值:byName根据属性名称注入,注入值bean的id值和
                              byType根据属性类型注入
      

      (2) 根据属性自动注入

  5. IOC操作Bean管理(外部属性文件)

    1. 直接配置数据库信息

      • 配置德鲁伊连接池

      • 引入德鲁伊连接池的jar包

      • 直接配置连接池

         <!--直接配置连接池-->
            <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
                <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://locallhost:3306/userDb"></property>
                <property name="username" value="root"></property>
                <property name="password" value="root"></property>
            </bean>
        
    2. 引入外部属性文件配置数据库连接池
      (1). 创建外部属性文件,properties格式文件,写数据库信息

      prop.driverClass=com.mysql.jdbc.Driver
      prop.url=jdbc:mysql://locallhost:3306/userDb
      prop.userName=root
      prop.password=root
      

      (2). 加入属性标签

      <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 http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd">
      

      (3) 引入外部文件

      (4) 配置连接池

      <!--    引入外部属性文件-->
          <context:property-override location="jdbc.properties"/>
      
          <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
              <property name="driverClassName" value="${prop.driverClass}"></property>
              <property name="url" value="${prop.url"></property>
              <property name="username" value="{prop.userName}"></property>
              <property name="password" value="{prop.password}"></property>
         </bean>
      

IOC 操作bean管理(基于注解方式)

  1. 什么是注解

    • 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
    • 使用注解,注解作用在类上面,方法上面,属性上面
    • 使用的注解:简化xml配置
  2. Spring针对Bean管理中创建对象提供注解

    • @Component

    • @Service

    • @Controller

    • @Repository

      上面四个注解功能是一样的,都可以用来创建bean实例

  3. 基于注解方式实现对象创建

    • 引入依赖aop 依赖

    • 开启组件扫描

      • 名称空间

        <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: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/context  http://www.springframework.org/schema/context/spring-context.xsd">
        
      • <!--开启组件扫描
           1. 如果扫描多个包,多个包使用逗号隔开
           2. 扫描包上层目录
           
        -->
           <context:component-scan base-package="com.atguigu.spring5.test,com.atguigu.spring5.test.service"></context:component-scan>
           <context:component-scan base-package="com.atguigu"></context:component-scan>
        
    • 创建类,在类上面添加创建对象的注解

      //在注解里面的value 属性值可以省略不写 默认是类名首字母小写
          
      @Component(value = "userService")
      public class UserService {
      
      
          public  void  add() {
      
              System.out.println("service add......");
          }
      
      }
      
    • 开启组件扫描细节配置

      <!--实例一
          use-default-filters 表示现在不使用默认filter 自己配置filter
          context:include-filter,设置扫描那些内容
      
      -->
          <context:component-scan base-package="com.atguigu.spring5" use-default-filters="false">
      
              <context:include-filter type="annotation"
                                      expression="org.springframework.stereotype.Controller"/>
      
          </context:component-scan>
          
          <!--实例二
              下面配置扫描包中所有内容
              context:exclude-filter: 设置那些内容不进行扫描
      
          -->
          <context:component-scan base-package="com.atguigu.spring5">
              <context:exclude-filter type="annotation"
                                      expression="org.springframework.stereotype.Controller"/>
          </context:component-scan>
          
      
  4. 基于注解方式实现属性注入

    • @Autowired:根据属性类型进行自动装配

      • 把service和dao对象创建,在service和dao类添加创建对象注解

      • 在service注入dao对象对象,在Service类中添加dao类型属性,在属性上面使用注解

        @Service
        public class UserService {
        
            //定义dao类型属性
            // 不需要加set方法
            //添加注入属性注解
            @Autowired //根据类型进行注入
            private UserDao userDao;
            public  void  add() {
                System.out.println("service add......");
                userDao.add();
            }
        }
        
    • @Qualifier:根据属性名称进行注入

      @Qualifier注解的使用,和上面@Autowired一起使用

      //在注解里面的value 属性值可以省略不写 默认是类名首字母小写
      //@Component(value = "userService")
      //@Service
      //    @Controller
      @Service
      public class UserService {
      
          //定义dao类型属性
          // 不需要加set方法
          @Autowired //根据类型进行注入
          @Qualifier(value = "userDaoImp11") //根据名称属性进行注入
          private UserDao userDao;
      
      
          public  void  add() {
      
              System.out.println("service add......");
              userDao.add();
          }
      
      }
      
    • @Resource:可以根据类型注入,可以根据名称注入

      @Service
      public class UserService {
      
          //定义dao类型属性
          // 不需要加set方法
      //    @Autowired //根据类型进行注入
      //    @Qualifier(value = "userDaoImp11") //根据名称属性进行注入
      //    private UserDao userDao;
      
      //    @Resource //根据类型进行注入
          @Resource(name = "userDaoImp11") //根据名称进行注入
          private  UserDao userDao;
      
          public  void  add() {
              System.out.println("service add......");
              userDao.add();
          }
      
      }
      
    • @Value:注入普通类型属性

      @Value(value = "adc")
      private String name;
      
  5. 完全注解开发

    1. 创建配置类,替代xml配置文件

      @Configuration // 作为配置,代替xml配置文件
      @ComponentScan(basePackages = {"com.atguigu"})
      public class SpringConfig {
      
      }
      
    2. 编写测试类

      @Test
      public void testService2() {
              // 加载配置类
          ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
          
          UserService userService = context.getBean("userService", UserService.class);
          System.out.println("userService = " + userService);
          userService.add();
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值