1、简单数据类型依赖注入(了解)
@Service
public class CustomerServiceImpl implements CustomerService {
// 简单类型的成员变量
@Value("Rose") // 参数的值简单类型
private String name = "Jack";
@Override
public void saveCustomer() {
System.out.println("service:保存客户信息");
System.out.println("name:" + name);
}
}
2、复杂类型数据依赖注入
(1)使用@value结合spEL完成
#{要注入的bean名称}
@Value("#{customerDaoImpl}")
//这里的Dao使用@Repository标注过的
private CustomerDao customerDao;
或
private CustomerDao customerDao;
@Value("#{customerDaoImpl}")
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
或
从配置文件中读取信息注入到Bean中
<util:properties id="ds" location="/WEB-INF/ds.properties"/>
driverClass=oracle.jdbc.driver.OracleDriver
jdbcUrl=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
user=SYSTEM
password=SYSTEM
@Component
public class JDBCDataSource {
@Value("#{ds.driverClass}")
private String driverClass;
@Value("#{ds.jdbcUrl}")
private String jdbcUrl;
@Value("#{ds.user}")
private String user;
@Value("#{ds.password}")
private String password;
}
(2)使用@Autowired注解
① @Autowired默认根据类型来匹配
② 标注@Autowired的bean,如果在启动时没有找到匹配的bean会报错,可以加required=false来避免
③ 标注@Autowired的bean,如果在启动时没有找到多个类型匹配的bean会报错
④ 如果要@Autowired根据名字匹配,可以和@Qualifier注解联合使用
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Autowired
@Qualifier("userDao")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Autowired
public void setUserDao(@Qualifier("userDao") UserDao userDao) {
this.userDao = userDao;
}
(3)使用@Resource注解
默认根据名称匹配,然后才根据类型匹配(匹配规则:要注入的属性名=bean名称)
@Service
public class UserDaoImpl implements UserDao
@javax.annotation.Resource
private UserDao userDao;
@Service
public class UserDaoImpl implements UserDao
@javax.annotation.Resource(name = "userDaoImpl")
private UserDao userDao;
@javax.annotation.Resource(name = "userDaoImpl")
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
如果此时再去建一个bean,也实现UserDao接口,此时,再两个类的service注解上都不去指定名称,看会发生什么情况,此时会报错!解决办法,在注入时指定名称
@javax.annotation.Resource(name = "userDaoImpl")
private UserDao userDao;
(4)使用Inject注解(需要导入jar,一般不用)
需要先导入 javax.inject 的 jar
使用@Inject注解,则按照类型注入,
//第四种: JSR-330标准(jdk) 提供 @Inject ,配合@Named注解
@Inject//默认按照类型注入
private CustomerDao customerDao;
使用@inject和@Named注解,则按照名称注入
//第四种: JSR-330标准(jdk) 提供 @Inject ,配合@Named注解
@Inject//默认按照类型注入
@Named("customerDao")//按照名字注入,必须配合@Inject使用
private CustomerDao customerDao;
Bean属性依赖注入
最新推荐文章于 2024-04-22 15:29:02 发布