• [Spring]第二篇:IOC控制反转


    简单的说就是,创建对象的权利,或者是控制的位置,由JAVA代码转移到spring容器,由spring的容器控制对象的创建,就是控制反转.

    1. spring创建对象时,会读取配置文件,配置文件中主要配置接口和实现类的关系,每个接口对相应一个实现类,使用标签配置,)中的信息,然后使用反射给我们创建好对象
    2. 创建好之后在容器(这个容器里放的是map集合,key为接口id,value为所对应的实现类)中存储起来,当我们需要某个对象时,通过id(集合的key)获取对象即可,不需要我们自己去new.如果要使用别的实现类,只需要在配置文件中修改实现类的路径名,不用修改代码

    一句话:创建对象交给容器,用的时候再去容器中取

    Spring解耦合的原理
    图解:

    一.简单使用IOC 

     1.创建maven项目,设置maven
    先创建一个空项目

    2.名字可以是spring_all

     在项目下创建模块 名字可以是spring_test_01

     

     3.pom.xml中导入spring依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframeworkgroupId>
    4. <artifactId>spring-coreartifactId>
    5. <version>5.3.5version>
    6. dependency>
    7. <dependency>
    8. <groupId>org.springframeworkgroupId>
    9. <artifactId>spring-beansartifactId>
    10. <version>5.3.5version>
    11. dependency>
    12. <dependency>
    13. <groupId>org.springframeworkgroupId>
    14. <artifactId>spring-contextartifactId>
    15. <version>5.3.5version>
    16. dependency>
    17. <dependency>
    18. <groupId>org.springframeworkgroupId>
    19. <artifactId>spring-expressionartifactId>
    20. <version>5.3.5version>
    21. dependency>
    22. dependencies>

    四个依赖介绍

    • spring-context      上下文,容器
    • spring-beans         创建对象
    • spring-core            核心jar
    • spring-expression 表达式jar

    但是事实上,我们导入spring-context的时候,会自动导入其他依赖的jar,自动进行了依赖传递
    所以,导入一个spring-context 依赖也可以

    4.为了方便测试,我们导入Junit测试依赖

    1. <dependency>
    2. <groupId>junitgroupId>
    3. <artifactId>junitartifactId>
    4. <version>4.13.1version>
    5. <scope>testscope>
    6. dependency>

    5.在项目中定义一个接口和实现类,接口中定义一个方法并在实现类中实现接口

    EmpDao接口和实现类

     6.在spring配置容器中的对象,创建spring配置文件, 文件名没有明确要求,暂时可以叫spring

     

    7.在spring.xml中配置一个需要由容器初始化的对象

     8.测试通过容器获取对象

     二.IOC底层原理和实现步骤

    1 XML解析技术读取配置文件

    <bean id="empDao" class="com.msb.dao.impl.EmpDaoImpl">bean>

    将上面的信息读取进入程序  对象的ID ,一个是对象的类的全路径名

    2 反射技术实例化对象,放到容器中

    1. 获得类的字节码:Class clazz =Class.forName("com.msb.dao.impl.EmpDaoImpl")
    2. 通过字节码实例化对象:Object obj  = clazz.newInstance();
    3. 将对象放到一个map集合中:map.put("empDao",obj)

    3工厂模式返回Bean对象

    使用getBean方法,getBena方法是BeanFactory 父接口下的一个方法,但一般我们使用ApplicationContext 接口去调用这个方法
                   

    1.   public Object getBean(String name){
    2.         Object obj =map.get(name);
    3.         return obj;
    4.   } 

    IOC接口有两个

    1.  BeanFactory  接口: IOC容器基本功能接口,是spring内部使用的接口,我们在处理业务时一般不直接使用该接口
    2.   ApplicationContext 接口: BeanFactory的子接口,提供更多更强大的功能,研发人员一般使用的接口

    接口下的实现类

    三 Spring中的Bean管理(面试常问)

    spring中的Bean的管理:
    Bean(汉译咖啡豆). 又称JAVABean.其实就是JAVA程序程序中的一个个对象,所以Bean的管理其实就是spring对于JAVA程序中的对象的管理

    管理的内容是什么:

    管理了两部分,第一部分是对象的创建  也就是我们所说的 IOC,第二部分是属性的赋值  也就是我们所说的 DI, 先创建完属性才能赋值

    1 对象的创建   IOC
    IOC   叫做控制反转,就是Spring给我们创建对象,然后我们直接用,不用自己NEW,前面已经解释过
    IOC处理的是对象如何创建的问题

    2 属性的赋值   DI
    DI   :(Dependency Injection),即“依赖注入” 就是创建属性时给对象属性赋值
    对象功能的实现往往要依赖属性的值,那么给对象属性赋值就可以说成是依赖注入
    由于对象属性不仅仅是基本数据类型,还可能是其他类,或者引用类型
    那么依赖注入将会把更多的对象之间的关系整理到一起,可以行程一个庞大的依赖关系
    DI处理的是对象的属性赋值和互相依赖的关系
    3.spring给我们提供了两种关于bean的方式

    1 基于XML方式的Bean管理

    2 基于注解方式的Bean管理

    四 测试基于XML方式的Bean管理

    1.创建新的模块并导入以下依赖

     

    依赖

           

    1. <dependency>
    2.             <groupId>org.springframeworkgroupId>
    3.             <artifactId>spring-contextartifactId>
    4.             <version>5.3.5version>
    5.         dependency>
    6.         <dependency>
    7.             <groupId>junitgroupId>
    8.             <artifactId>junitartifactId>
    9.             <version>4.13.1version>
    10.             <scope>testscope>
    11.         dependency>

    2.创建spring配置文件,一般spring的配置文件很多人约定俗称为application****.xml

     

    3.准备一个要实例化的类

    1. public class User {
    2.     private Integer userid;
    3.     private String username;
    4.     private String password;
    5.     @Override
    6.     public String toString() {
    7.         return "User{" +
    8.                 "userid=" + userid +
    9.                 ", username='" + username + '\'' +
    10.                 ", password='" + password + '\'' +
    11.                 '}';
    12.     }
    13.     public User() {
    14.         System.out.println("noArgConstructor");
    15.     }
    16.     public User(Integer userid, String username, String password) {
    17.         System.out.println("allArgConstructor");
    18.         this.userid = userid;
    19.         this.username = username;
    20.         this.password = password;
    21.     }
    22.     public void setUserid(Integer userid) {
    23.         System.out.println("setUserid");
    24.         this.userid = userid;
    25.     }
    26.     public void setUsername(String username) {
    27.         System.out.println("setUsername");
    28.         this.username = username;
    29.     }
    30.     public void setPassword(String password) {
    31.         System.out.println("setpassword");
    32.         this.password = password;
    33.     }
    34. }

    4.IOC创建对象:通过无参构造方法构造对象

     <bean id="user1" class="com.msb.bean.User">bean>

    标签的常见属性

     <bean id="user1" class="com.msb.bean.User" name="user1" scope="prototype" lazy-init="true" >bean>

    • id    对象的id
    • class 类的全路径名
    • name 和id类似,一般不用
    • scope 控制对象单例多例和使用范围   ,包含以下5个属性
    1.   singleton作用域(scope 默认值), Spring IOC容器中只会存在一个共享的bean实例
    2.   prototype作用域部署的bean,每一次获取都会产生一个新的bean实例,相当与一个new的操作
    3.     request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
    4.     session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
    5.     global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义
    • lazy-init 懒加载 调用getBean的时候再去实例化对象

    以上主要是SpringIOC的IOC内容,后续会持续更新DI部分,以及AOP部分

  • 相关阅读:
    一不小心晋级“CCF国际AIOps挑战赛”决赛?
    k8s(13) : 备份配置
    1203、字段约束、主键、外键、mysql索引、mysql用户管理
    py4_简单接触 Python 正则表达式
    汽车自动驾驶是人工智能吗,自动驾驶是人工智能
    iOS App上架全流程及相关处理
    Android 日期筛选器
    TOP10-k8s-安全措施
    蓝桥杯:子串分值
    自动化您的Instagram帐户的程序InstaBot Pro 7.0.2
  • 原文地址:https://blog.csdn.net/listeningdu/article/details/128095656