依赖注入:在Spring创建对象的同时,为其属性赋值,称之为依赖注入。
创建对象时,Spring工厂会通过Set方法为对象的属性赋值。
范例:定义一个Bean类型
public class User {
private String name;
private int age;
private double money;
private String hobby;
private Date birthday;
//省略set、get方法、构造方法
}
属性注入
<bean id="user" class="com.ying.pojo.User">
<property name="name" value="张三"/>
<property name="age" value="10"/>
<property name="hobby" value="打篮球"/>
<property name="money" value="200.22"/>
<property name="birthday" ref="date"/>
bean>
<bean id="date" class="java.util.Date">
<property name="year" value="122"/>
bean>
范例:定义一个Bean类型 提供构造方法
public class User {
private String name;
private int age;
private double money;
private String hobby;
private Date birthday;
//省略set、get方法、构造方法
}
构造方法注入
<bean id="user1" class="com.ying.pojo.User">
<constructor-arg index="0" value="赵六"/>
<constructor-arg index="1" value="60"/>
<constructor-arg index="2" value="444.44"/>
<constructor-arg index="3" value="rap"/>
<constructor-arg index="4" ref="date"/>
bean>
复杂类型指的是:list、set、map、array、properties等类型
定义复杂Bean类型
public class Person {
private List<User> userList;
private Map<String,String> map;
private Set<String> set;
private String[] arr;
private Properties properties;
//省略set、get方法、构造方法
}
给复杂类型注入属性值
<bean id="person" class="com.ying.pojo.Person">
<property name="userList">
<list>
<bean class="com.ying.pojo.User">bean>
<bean class="com.ying.pojo.User">bean>
<bean class="com.ying.pojo.User">bean>
list>
property>
<property name="set">
<set>
<value>1value>
<value>2value>
<value>3value>
set>
property>
<property name="arr">
<array>
<value>avalue>
<value>bvalue>
<value>cvalue>
array>
property>
<property name="map">
<map>
<entry key="k1" value="v1">entry>
<entry key="k2" value="v2">entry>
<entry key="k3" value="v3">entry>
map>
property>
<property name="properties">
<props>
<prop key="driver">com.mysql.jdbc.Dirverprop>
<prop key="url">jdbc:mysql:///java2101prop>
props>
property>
bean>
范例:在UserServiceImpl中注入UserDaoImpl类型的属性
public class UserServiceImpl {
private UserDaoImpl userDao;
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
public void addUser(){
userDao.addUser();
}
}
<bean id="userDao" class="com.ying.dao.UserDaoImpl">bean>
<bean id="userService" class="com.ying.service.UserServiceImpl">
<property name="userDao" ref="userDao">property>
bean>
Spring整合DBUtils实现JDBC开发
EmpServiceImpl
public class EmpServiceImpl {
private EmpDaoImpl empDao;
public void setEmpDao(EmpDaoImpl empDao) {
this.empDao = empDao;
}
public List<Emp> getAll(){
try {
return empDao.getAll();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return null;
}
}
EmpDaoImpl
public class EmpDaoImpl {
private QueryRunner queryRunner;
public EmpDaoImpl(QueryRunner queryRunner) {
this.queryRunner = queryRunner;
}
public List<Emp> getAll() throws SQLException {
return queryRunner.query("select * from emp ",new BeanListHandler<Emp>(Emp.class));
}
}
依赖注入配置
<bean id="empService" class="com.ying.service.EmpServiceImpl">
<property name="empDao" ref="empDao"/>
bean>
<bean id="empDao" class="com.ying.dao.EmpDaoImpl">
<constructor-arg name="queryRunner" ref="queryRunner">constructor-arg>
bean>
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
<constructor-arg name="ds" ref="dataSource"/>
bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///java2101"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
bean>
测试
@Test
public void test05(){
//创建Spring容器对象
ApplicationContext ac =
new ClassPathXmlApplicationContext("applicationContext.xml");
EmpServiceImpl empService = ac.getBean("empService", EmpServiceImpl.class);
List<Emp> empList = empService.getAll();
empList.stream().forEach(System.out::println);
}
<context:component-scan base-package="com.ying"/>
用于替换自建类型组件的
标签;可以更快速的声明bean
@Component 注解的含义:创建类的对象,相当于xml中配置的bean标签
- @Controller 针对于控制器层的类的注解
- @Service 针对于业务层的类的注解
- @Repository 针对持久层的类的注解 Dao数据访问层
@Component
//@Service("empService")
//@Controller("empService")
//@Repository("empService")
public class EmpServiceImpl implements EmpService{
}
主要用于属性注入,Spring
@Autowired 自动装配:将对象属性自动进行注入(类型注入)
@Qualifier(“empDaoImpl1”) 限定要自动注入的bean的id,一般和@Autowired联用
注意:@Autowired先会按照类型注入,如果这个类有多个实例,那么再按照名称注入,
如果有多个实例那么需要使用Qualifier进行指定
@Component
public class EmpServiceImpl implements EmpService{
@Autowired
@Qualifier("empDaoImpl1")
//@Resource(name="empDaoImpl2")
private EmpDao empDao;
public void addEmp(){
empDao.addEmp();
}
}
主要用于属性注入,jdk
@Resource 自动装配:将对象属性自动进行注入(名称注入)
注意:默认按照名称进行装配,如果找到指定的名称则直接注入。如果没有找到,那么再按类型称注入,如果有多个实例那么需要使用name属性进行指定
@Component//@Controller @Service @Repository
public class EmpServiceImpl implements EmpService{
@Resource(name="empDaoImpl2")
private EmpDao empDao;
public void addEmp(){
empDao.addEmp();
}
}