栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

一、IOC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一、IOC

一、IOC 1、Spring框架介绍
  1. Spring是轻量级的开源的javaEE框架
  2. Spring有两个核心部分: IOC 和 AOP
    1. IOC : 控制反转,把创建对象的过程交给Spring进行管理
    2. AOP: 面向切面,不修改源代码进行功能增强
  3. Spring特点:
    1. 方便解耦,简化开发
    2. AOP编程支持
    3. 方便程序测试
    4. 方便和其他框架进行整合
    5. 方便进行事务操作
    6. 降低API开发难度
2、导入Spring相关jar包
    

        
            commons-logging
            commons-logging
            1.2
        
        
            org.springframework
            spring-beans
            5.2.12.RELEASE
        
        
            org.springframework
            spring-context
            5.2.12.RELEASE
        
        
            org.springframework
            spring-core
            5.2.12.RELEASE
        
        
            org.springframework
            spring-expression
            5.2.12.RELEASE
        
    
3、IOC容器底层原理
  1. 什么是IOC
    1. 控制反转,把对象创建和对象之间的调用过程交给Spring进行管理
    2. 使用IOC的目的就是降低耦合度
  2. IOC底层原理
    1. 通过xml解析读取xml配置文件中配置的bean标签,获取到配置的全类名
    2. Bean工厂类通过反射Class.forName(全类名)创建Class的对象
    3. 通过一个Bean工厂类将对象返回,完成对象的创建
4、IOC(BeanFactory接口)
  1. IOC思想基于IOC容器完成,IOC容器底层就是一个对象工厂

  2. Spring提供IOC容器有两种基本方式(两个接口)

    1. BeanFactory:IOC的基本实现,Spring内部使用的接口,开发人员不建议使用
      • 特点:加载配置文件的时候不会创建对象,在获取对象(getBean())才会创建对象
    2. ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,开发人员使用
      • 特点:加载配置文件的时候就会把在配置文件中的对象进行创建
  3. 继承树

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wrOrR4wQ-1633095315463)(C:UsersAdministrator.DESKTOP-O7Q3NEAAppDataRoamingTyporatypora-user-imagesimage-20210926134223580.png)]

5、IOC操作Bean管理
  1. Bean管理是指两个操作
    • Spring创建对象
    • Spring为对象注入属性
  2. Bean管理有两种方式
    • 基于xml配置文件方式实现
    • 基于注解方式实现
6、基于xml方式的Bean管理
  1. 创建对象: 在spring的配置文件中使用bean标签,默认调用的是类的无参构造器

    
    
  2. 注入属性:两种方式注入属性

    1. 使用通过setter方法注入属性,要求类必须提供setter方法

          
              
              
          
      
    2. 通过constructor构造器注入属性,此时不再调用类的无参构造器,创建对象

          
              
              
          
      
    3. p命名空间注入,本质上还是setter方法注入,不做解释

  3. 如何给属性注入null等特殊符号

    1. 注入null值

          
              
                  
              
          
      
    2. 注入特殊符号

          
      
              
                  ]]>
              
          
      
  4. 如何注入外部bean

    1. 使用ref进行注入

          
              
          
      
          
      
    2. 使用内部bean注入

          
              
              
              
                  
                      
                  
              
          
      
    3. 使用级联注入

  5. 集合类型怎么注入

        
            
                
                    数组1
                    数组2
                
            
            
                
                    
                    
                    
                
            
            
                
                    
                    
                
            
            
                
                    set1
                    set2
                    set3
                
            
        
        
            
            
        
        
            
            
        
        
            
            
        
    
7、Spring中Bean的类型
  • 普通bean:在配置文件中定义bean类型就是返回类型,上面的都是普通bean

  • 工厂bean(FactoryBean) : 通过配置工厂,返回工厂要返回的类型

    • 实现步骤:

      1. 创建类,让这个类实现FactoryBean接口,重写getObject()方法,指定返回的对象

        public class CourseFactory implements FactoryBean {
            @Override
            public Course getObject() throws Exception {
                Course course = new Course();
                course.setName("一本书");
                return course;
            }
            @Override
            public Class getObjectType() {
                return null;
            }
            @Override
            public boolean isSingleton() {
                return false;
            }
        }
        
      2. 在配置文件中配置工厂类

        
        
      3. 测试

            @Test
            public void test1(){
                ApplicationContext context = 
                    new ClassPathXmlApplicationContext("application.xml");
                Course bean = context.getBean("bean", Course.class);
                System.out.println(bean);
            }
        
8、Spring中Bean的作用域(scope属性)
scope属性值作用域解释
scope=“singleton”默认值,bean在容器中是单例的
scope=“prototype”bean在容器中是原形的,即是多例的
scope=“request”一次请求间bean的单例的,很少使用
scope=“session”一次会话间bean是单例的,很少使用
  • singleton 和 prototype的区别?
    1. singleton 是单例的 prototype是多例的
    2. scope的属性值为singleton时,在加载Spring配置文件的时候就会创建实例对象,而设置scope的属性值为prototype时,在调用getBean()方法时才创建对象
9、Bean的生命周期
  1. 第一步:调用无参构造器
  2. 第二步:调用setter方法注入属性
  3. 第三步:我在bean初始化方法前执行,Bean的后置处理器postProcessBeforeInitialization()方法
  4. 第四步:调用初始化方法,需要配置
  5. 第五步:我在bean初始化方法后执行,bean的后置处理器postProcessAfterInitialization()方法
  6. 第六步:bean正在被使用
  7. 第七步:调用销毁方法,需要配置
    
        
    

    
public class LifeBean {
    private String name;
    public LifeBean() {
        System.out.println("第一步:调用无参构造器");
    }
    public void setName(String name) {
        System.out.println("第二步:调用setter方法注入属性");
        this.name = name;
    }
    public void initMethod(){
        System.out.println("第四步:调用初始化方法,需要配置");
    }
    public void userBean(){
        System.out.println("第六步:bean正在被使用");
    }
    public void destroyMethod(){
        System.out.println("第七步:调用销毁方法,需要配置");
    }
}

后置处理器BeanPost

public class BeanPost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第三步:我在bean初始化方法前执行,Bean的后置处理器");
        return null;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第五步:我在bean初始化方法后执行,bean的后置处理器");
        return null;
    }
}

测试

    
    @Test
    public void test2(){
        ClassPathXmlApplicationContext context = 
            new ClassPathXmlApplicationContext("application.xml");
        LifeBean life = context.getBean("lifeBean", LifeBean.class);
        life.userBean();
        //关闭容器时bean被销毁
        context.close();
    }
10、基于xml的自动装配
  • bean中有一个属性为autowire完整自动装配属性值指定装配规则
    • 属性值为byName : 根据属性名称自动装配
    • 属性值为byType : 根据属性类型自动装配
11、基于xml引入外部属性文件
  • 以druid数据库连接池为例

    • druid.properties

      driverClassName=com.mysql.jdbc.Driver
      url=jdbc:mysql://127.0.0.1:3306/mnyuansql
      username=root
      password=1234
      
    • application.xml 要引入context命名空间

      
      
          
          
          
              
              
              
              
          
      
      
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/284420.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号