依赖注⼊(DI)的三种实现⽅式
本⽂来探讨⼀下依赖注⼊的三种实现⽅式是哪三种,Spring的⽀持⼜怎么样。
⾸先,依赖注⼊(DI)的实现⽅式有三种:设值注⼊、构造⽅法注⼊、接⼝注⼊,下⾯来看看这三种注⼊⽅式在Spring中的⽀持怎么样。
1、设值注⼊。
①、新建⼀个项⽬
②、新建⼀个User类,实现setter、getter⽅法
1.
package com.bean;
2.
3.
public class User {
4.
String username;
5.
String password;
6.
public String getUsername() {
7.
return username;
8.
}
9.
public void setUsername(String username) {
10.
this.username = username;
11.
}
12.
public String getPassword() {
13.
return password;
14.
}
15.
public void setPassword(String password) {
16.
this.password = password;
17.
}
18.
19.
}
③、新建⼀个接⼝,名字为UserDAO,⾥⾯包含⼀个save⽅法,将信息存⼊数据库
1.
3.
import com.bean.User;
4.
5.
public interface UserDAO {
6.
public void save(User user);
7.
}
④、新建⼀个UserDAO的实现类UserDAOImpl,实现save⽅法,模拟数据库存⼊
1.
package com.dao;
2.
3.
import com.bean.User;
4.
5.
public class UserDAOImpl implements UserDAO {
6.
7.
@Override
8.
public void save(User user) {
9.
// TODO Auto-generated method stub
10.
System.out.Username()+"被存储");
11.
}
12.
13.
}
⑤、为了不将直接操作数据库的对象UserDAO暴露给⽤户,需添加service层,在数据库操作前后添加业务逻辑。先实现业务逻辑接⼝UserService:
1.
package com.bean;
2.
3.
public interface UserService {
4.
public void add(User user);
5.
}
然后再写这个接⼝的实现类UserServiceImpl:
1.
package com.bean;
2.
3.
import com.dao.UserDAO;
4.
5.
public class UserServiceImpl implements UserService {
6.
7.
private UserDAO userDAO;
8.
9.
public UserDAO getUserDAO() {
10.
return userDAO;
11.
}
12.
13.
//设值注⼊为UserDAO的注⼊做准备
14.
public void setUserDAO(UserDAO userDAO) {
15.
this.userDAO = userDAO;
16.
}
17.
//实现负责业务逻辑的add⽅法
18.
@Override
19.
public void add(User user) {
20.
/
/ TODO Auto-generated method stub
21.
userDAO.save(user);
22.
}
23.
24.
}
⑥、在src下创建Spring配置⽂件,命名为l,在其中配置数据访问类和业务逻辑实现类:
1.
<?xml version="1.0" encoding="UTF-8"?>
2.
<beans xmlns="/schema/beans" xmlns:context="/schema/context"
xmlns:xsi="/2001/XMLSchema-instance" xmlns:aop="/schema/aop"
3.
xmlns:util="/schema/util" xmlns:jdbc="/schema/jdbc"
4.
xmlns:cache="/schema/cache"
5.
xsi:schemaLocation="
6.
/schema/context
7.
/schema/context/spring-context.xsd
8.
/schema/beans
9.
/schema/beans/spring-beans.xsd
10.
/schema/tx
11.
/schema/tx/spring-tx.xsd
12.
/schema/jdbc
13.
/schema/jdbc/spring-jdbc-3.1.xsd
14.
/schema/cache
15.
/schema/cache/spring-cache-3.1.xsd
16.
/schema/aop
17.
/schema/aop/spring-aop.xsd
18.
/schema/util
19.
/schema/util/spring-util.xsd">
20.
<!-- 配置数据访问类,实例名称为u -->
21.
<bean id="u" class="com.dao.UserDAOImpl">
22.
</bean>
23.
<bean id="user" class="com.bean.User">
24.
</bean>
25.
26.
<!-- 设值注⼊配置业务逻辑实现类,实例名称为userService-->
27.
<bean id="userService" class="com.bean.UserServiceImpl">
28.
<!-- 在这⾥实现注⼊,注⼊实例名称为u的实例到该实例的userDAO属性 -->
29.
<property name="userDAO">
30.
<ref bean="u" />
31.
</property>
32.
</bean>
33.
</beans>
⑦、写⼀个测试⽅法进⾏测试(为了简洁,这⾥没有加上测试类,也没有引⼊包,读者写的时候需要注意)
//设值注⼊测试
2.
public static void setValDI(){
3.
//初始化容器
4.
ApplicationContext ctx = new ClassPathXmlApplicationContext("l");
5.
UserServiceImpl service = (Bean("userService");
实例化bean的三种方式
6.
User u=(Bean("user");
7.
u.setPassword("123456");
8.
u.setUsername("test");
9.
service.add(u);
10.
}
2、构造⽅法注⼊
①、修改UserServiceImpl类加上构造⽅法
1.
package com.bean;
2.
3.
import com.dao.UserDAO;
4.
5.
public class UserServiceImpl implements UserService {
6.
7.
private UserDAO userDAO;
8.
9.
public UserDAO getUserDAO() {
10.
return userDAO;
11.
}
12.
13.
public void setUserDAO(UserDAO userDAO) {
14.
this.userDAO = userDAO;
15.
}
16.
17.
//如果需要构造⽅法注⼊则这⾥必须写上构造⽅法
18.
public UserServiceImpl(UserDAO userDAO) {
19.
super();
20.
this.userDAO = userDAO;
21.
}
22.