手记

【金秋打卡】第7天 对象依赖注入

课程信息

● 学习课程:Java工程师2022版
● 章节名称:Spring Ioc容器与Bean管理-对象依赖注入
● 讲师:悟空

课程内容

对象依赖注入
依赖注入是指运行时将容器内对象利用反射赋给其他对象的操作
基于setter方法注入对象
利用setter实现静态数值注入,需要使用property标签中的value属性,程序运行时IoC容器利用反射,通过set方法,为对象属性赋值。
利用setter实现对象注入,完成对象和对象之间的关联关系。需要在property标签中使用ref属性完成对象之间的关联
上述两个对象注入的方法都要求,javabean具有属性的set方法,set方法和get方法一般是成对出现的。
《依赖注入的优势》
以book-shop举例,service和dao分别由员工A和员工B进行开发,
两人分别创建applicationContext-service.xml和applicationContext-dao.xml
在这样员工A在Service中就可以直接使用员工B创建dao对象了。
当DAO基类变更之后,并不会影响service调用dao的代码,实现了两个对象的解耦

<!-- applicationContext-service.xml -->
<bean id="bookService" class="com.imooc.spring.ioc.bookshop.service.BookService">
  <property name="bookDao" ref="bookDao" />
</bean>

<!-- applicationContext-dao.xml -->
<bean id="bookDao" class="com.imooc.spring.ioc.bookshop.dao.BookDaoImpl">
  
</bean>
//BookDao
public interface BookDao {
    public void insert();
}

//BookDaoImpl
public class BookDaoImpl implements BookDao {
    public void insert() {
        System.out.println("向MySQL Book插入一条数据");
        bookDao.insert();
    }
}

//BookDaoOracleImpl
public class BookDaoOracleImpl implements BookDao{
    public void insert() {
        System.out.println("向Oracle Book表插入一条数据");
    }
}

public class BookService{
    private BookDao bookDao;
    public void purchase(){
        System.out.println("正在执行图书采购业务方法");
    }
    public BookDao getBookDao() {
        reutrn bookDao;
    }
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

//BookShopApplication
public class BookShopApplication {
	public void main(String[] args){
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-*.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        bookService.purchase();
    }
}

基于构造方法注入对象
和基于构造方法实例化对象非常相似
需要使用constructor-arg标签中的ref属性这种注入方式
通过调用带参数的构造方法实现,每个参数代表一个依赖

<bean id="andy" class="com.example.demo.entity.Child">
  <constructor-arg name="name" value="安迪">
    <constructor-arg name="apple" value="sourApple">
</bean>

注入集合对象

<!-- 注入list -->
<bean id="" class="">
  <property name="someList">
    <list>
      <value>具体值</value>
      <ref bean="beanId"></ref>
    </list>
  </property>
</bean>

<!-- 注入set -->
<bean id="" class="">
  <property name="someSet">
    <set>
      <value>具体值</value>
      <ref bean="beanId"></ref>
    </set>
  </property>
</bean>

<!-- 注入map -->
<bean id="" class="">
  <property name="someMap">
    <map>
      <entry key="K1" value="V1"></entry>
      <entry key="K2" value-ref="beanId"></entry>
    </map>
  </property>
</bean>

<!-- 注入properties -->
<bean id="" class="">
  <property name="someMap">
    <porps>
      <prop key="K1">V1</prop>
      <prop key="K2">V2</prop>
    </props>
  </property>
</bean>

list集合不能避免重复,为了避免重复将list改成set,数据允许重复就是用list(生成的是Arraylist),不允许重复就使用set(生成的是LinkedHashSet,是有序排列的):
map(生成的LinkedHashMap)
查看容器内对象

public static void main(String[] args){
	ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-*.xml");
    Company company = context.getBean("company", Company.class);
    System.out.println(company);
    String websit = company.getInfo().getProperty("website");
    System.out.println(company);
    //获取容器内所有beanId数组
    String[] beanNames = context.getBeanDefinitionNames();
   for(String beanName: beanNames){
       System.out.println(beanName);
       System.out.println("类型:"+context.getBean(beanName).getClass().getName());
   }
    // 多个提取默认#0
	Computer computer = context.getBean("com.imooc.spring.ioc.entry.Computer",Computer.class);
    System.out.println(computer.getBrand());
    Computer computer1 = context.getBean("com.imooc.spring.ioc.entry.Computer#1",Computer.class);
    System.out.pritnln(computer1.getBrand());
    SpringApplication.run(SpringBootApplication.class, args);
}

学习收获

主要学习对象的依赖注入,基于setter方法或者构造方法注入,使用依赖注入的好处,以及如何注入集合的对象,注入例如list,set,map,properties等的书写方式,然后如何查看容器内的对象

打卡截图


0人推荐
随时随地看视频
慕课网APP