Spring学习日记01_IOC_xml的三种注入方式

2021年7月1日 23点热度 0条评论 来源: Ueao

什么是IOC

  • 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
  • 使用IOC目的:为了耦合度降低
  • 做入门案例就是IOC实现

IOC底层原理

  • xml解析 工厂模式 反射

原始方式

class UserService{
  execute(){
    UserDao dao = new UserDao();
    dao.add();
  }
}

class UserDao{
  add(){
    ...
  }
}
  • 缺点:耦合度太高

工厂模式

class UserService{
  execute(){
    UserDao dao = UserFactory.getDao();
    dao.add();
  }
}

class UserDao(){
  add(){
    ...
  }
}

class UserFactory{
  public static UserDao getDao(){
    return new UserDao();
  }
}
  • 目的:耦合度还可降低

IOC解耦过程

  1. xml配置文件,配置创建的对象
    <bean id = "own" class = "com.own.UserDao"></bean>

  2. 有service类和dao类,创建工厂类

class UserFactory{
  public static UserDao getDao(){
    String classValue = class属性值; // 1.xml解析
    Class clazz = Class.forName(classValue); // 2.通过反射创建对象
    retuen (UserDao) clazz.newInstance();
  }
}
  • 进一步降低耦合度

IOC(接口)

  1. IOC思想基于IOC容器完成,IOC容器底层就是对象工厂

  2. Spring提供IOC容器实现两种方式:(两个接口)

  • BeanFactory:IOC容器基本实现,是SPring内部的使用接口,比提供开发人员进行使用
    • 加载配置文件的时候不会创建对象,在获取(使用)对象时才去创建对象
  • ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
    • 加载配置文件时就创建对象
  1. ApplicationContext接口实现类(主要两个)
  • FileSystemXmlApplicationContext (磁盘路径)

  • ClassPathXmlApplicationContext (相对路径)

//xml配置文件
<bean id = "user" class = "com.own.User"></bean>

//Java类
public void test(){

   //1. 加载spring配置文件
  ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

   //2. 获取配置创建的对象
  User user = context.getBean("user",User.class);

}

IOC操作Bean管理(概念)

  1. 什么是Bean管理?
  • Bean管理指的是两个操作
    • Spring创建对象
    • Spring注入属性
  1. Bean管理操作有两种方式
  • 基于xml配置文件方式实现
  • 基于注解方式实现

IOC操作Bean管理(基于xml方式)

  1. 基于xml方式创建对象
    <bean id = "user" class = "com.own.user"></bean>
  • 在spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
  • 在bean标签中有很多属性,介绍常用的属性
    • id属性:唯一标识
    • class属性:类全路径(包类路径)
  • 创建对象时,默认执行无参数构造方法完成对象创建
  1. 基于xml方式注入属性
  • DI:依赖注入,就是注入属性

第一种注入方式:使用set方法注入

public class Book{
  //1. 创建属性
  private String bname;
  //2. 创建属性对应的set方法
  public void setBname(String bname){
    this.bname = bname;
  }
  public void say(){
    System.out.println("===>"+bname);
  }
}
  
  //3. xml进行配置
  <bean id = "book" class = "com.own.Book">
    <property name = "bname" value = "zhangsan"><property>
  </bean>  
  
  //4. 测试
  public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Book book = context.getBean("book",Book.class);
    System.out.println(book); 
    book.say();   
  }

  //原始方法:对象调用set方法
  public static void main(String[] args){
    Book book = new Book();
    book.setBname("abc");
  }

第二种注入方式:使用有参构造方法注入

public class Book{
  //1. 创建属性
  private String bname;
  //2. 创建属性对应的有参构造方法
  public Book(String bname){
    this.bname= bname;
  }
  public void say(){
    System.out.println("===>"+bname);
  }  
} 

  //3. xml进行配置
  <bean id = "book" class = "com.own.Book">
    //第一种方式:指定name  
    <constructor-arg name="bname" value="lee"><constructor-arg>
    //第二种方式:下标法
    <constructor-arg index="0" value="lee"><constructor-arg>
  </bean>  

  //4. 测试
  public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Book book = context.getBean("book",Book.class);
    System.out.println(book); 
    book.say();   
  }

  //原始方法
  public static void main(String[] args){
    Book book = new Book("abc");
  }

第三种注入方式:p名称空间注入(了解)

  • 可以简化基于xml配置方式
// 1. 添加p名称空间在配置文件中
<beans xmlns:p="http://www.springframework.org/schema/p">
  //2. 进行属性注入,在bean标签里面进行操作,底层还是set注入
  <bean id = "book" class="com.own.Book" p:name="wanger"></bean>
</beans>
    原文作者:Ueao
    原文地址: https://www.cnblogs.com/iron1213/p/14947958.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。