课程信息
● 学习课程: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等的书写方式,然后如何查看容器内的对象