一、依赖注入
依赖注入分为两大块,每块对应简单类型和引用类型的注入
- setter注入
- 简单类型
- 引用类型
- 构造器注入
- 简单类型
- 引用类型
1.1、setter注入引用类型、简单类型
1,在bean中定义引用类型属性并提供set方法
import dao.BookDao;
import service.BookService;
public class BookServiceImp implements BookService {
private BookDao bookDao;
@Override
public void save() {
System.out.println("人家是Service啦~~~~");
bookDao.save();
}
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
2,配置中使用property标签的ref属性注入引用类型,value注入简单类型
<bean id="bookDaoId" name = "bookDao,bd" class="dao.impl.BookDaoImp" scope="prototype" />
<bean id="bookService" class="service.impl.BookServiceImp" scope="prototype">
<property name="bookDao" ref="bd" />
</bean>
ref:容器中的bean的标识(id)
name:被注入类的set方法,去掉set后首字母小写。比如setBookDao为bookdao
注入简单类型同上,将ref修改为value即可
<property name="同上" value="注入值" />
1.2、构造器注入引用类型、简单类型
1,在bean中定义属性并提供构造方法
public class BookServiceImpl implements BookService {
private BookDao bookDao;
private String easyType;
//构造注入
public BookServiceImpl(BookDao bookDao,String easyType) {
//引用类型
this.bookDao = bookDao;
//简单类型
this.easyType = easyType;
}
public BookServiceImpl() {
System.out.println("我是Service,我被生成咯~~~~~~~~~");
}
@Override
public void save() {
System.out.println("人家是Service啦~~~~~~~~~");
bookDao.save();
}
}
2,配置中使用constrctor-arg标签的ref属性注入引用类型,value注入简单类型
<bean id = "fromBookDao" name= "bookDao,bd;b1" class="com.brrbaii.dao.daoImpl.BookDaoImpl"/>
<!-- <bean id = "orderDao" class="com.brrbaii.factory.OrderDaoFacatory" factory-method="getOrderDaoImpl" />-->
<bean id = "bookService" class="com.brrbaii.service.serviceImpl.BookServiceImpl" >
<!--
name:具体要配置的一个属性
ref:参照哪一个Bean
这里表示的是:我们要配置bookService里创建的bookDao对象,而这个对象来自于Bean里的fromBookDao
value:值
-->
<!--注入引用类型-->
<constructor-arg name = "bookDao" ref = "fromBookDao" />
<!--注入简答类型-->
<constructor-arg name = "easyType" value = "123" />
</bean>
二、自动装配
IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean的过程称为自动装配
自动装配方式:
- 按类型(autowire="byName")
- 按名称
- 按构造方法
- 不启用
按类型 :
<!--自动装配(按类型)--> <bean id = "bookService" class="com.brrbaii.service.serviceImpl.BookServiceImpl" autowire="byType" /> 注意: 需要在bean中提供setter方法,提供的类型要唯一
按名称:
<!--自动装配(按名称)--> <bean id = "bookService" class="com.brrbaii.service.serviceImpl.BookServiceImpl" autowire="byName" /> 注意: 容器中注册的bean的id需要和bean中引用的属性名相同
自动装配特征:
- 自动装配用于引用类型依赖注入,不能注入简单类型
- 按类型装配(byType)必须保证容器中相同类型的bean唯一
- 按名称装配(byName)必须保证容器中具有指定名称的bean,变量名与配置耦合,不推荐
- 自动装配优先级低于setter注入和构造器注入,上述两种同时出现时自动装配失效
三、管理第三方bean
这里管理Druid数据源作为示范
1,添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
2,创建db.properties
driver = com.mysql.cj.jdbc.Driver url = jdbc:mysql://localhost:3306/brrbaii?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true username = root password = 123456
3,开启context命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
>
4,在容器中引入properties文件
<context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>
5,配置Druid连接池
<!--Druid连接池-->
<bean id = "dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</bean>