1 @Autowired
@Autowired
根据属性类型进行自动装配。
(1)创建 service 和 dao 类,并在类上添加在bean中创建实例的注解。
UserDao 接口:
public interface UserDao {
void addUser();
}
UserDaoImpl 实现类:
@Repository
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("dao add....");
}
}
UserService:
// 相当于 <bean id="userService" class="com.hjc.auto.service.UserService"/>
// value = "userService" 可以不写,默认是类名的首字母小写
@Service(value = "userService")
public class UserService {
public void addUser() {
System.out.println("service add......");
}
}
别忘了需要在xml配置文件中开启组件扫描。
<?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">
<!--写法一:如果扫描多个包,使用逗号隔开-->
<context:component-scan base-package="com.hjc.auto.dao, com.hjc.auto.service"/>
</beans>
(2)在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解。
@Autowired
是根据属性类型来注入的,此处的属性类型是 UserDao
它就会去找到此接口的实现类 UserDaoImpl
进行注入,然后我们就可以成功调到 userDao.addUser()
方法。
@Service(value = "userService")
public class UserService {
@Autowired
private UserDao userDao;
public void addUser() {
System.out.println("service add......");
userDao.addUser();
}
}
(3)测试
@Test
public void test4() {
ApplicationContext context = new ClassPathXmlApplicationContext("beanAuto.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.addUser();
}
2 @Qualifier
@Qualifier
是根据属性名称进行注入。
@Qualifier
注解的使用,需要和上面 @Autowired
一起使用。
Tips:有时候一个接口会有多个实现类,因此就必须要用 @Qualifier
注解根据名称来说明到底要注入哪一个类。
(1)我给 UserDaoImpl
在 bean 中创建的实例对象取一个名称 hjc
.
@Repository(value = "hjc")
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("dao add....");
}
}
(2)此时 UserService
类中,给 UserDao
注入属性的时候就需要用 @Qualifier(value = "hjc")
来说明我要注入的类是哪一个。
@Service(value = "userService")
public class UserService {
@Autowired
@Qualifier(value = "hjc")
private UserDao userDao;
public void addUser() {
System.out.println("service add......");
userDao.addUser();
}
}
(3)如果我改成 hjc1
则会报错。
@Autowired
@Qualifier(value = "hjc1")
private UserDao userDao;
3 @Resource
@Resource
可以根据属性类型注入,也可以根据属性名称注入。
// @Resource // 根据类型进行注入
@Resource(name = "hjc") // 根据名称进行注入
private UserDao userDao;
Tips:
@Resource
属于 javax.annotation.Resource;
@Autowired
属于 org.springframework.beans.factory.annotation.Autowired;
@Qualifier
属于 org.springframework.beans.factory.annotation.Qualifier;
由于,@Autowired
和 @Qualifier
都是 Spring 原生的,而 @Resource
不是,因此更建议使用前者。
4 @Value
@Value
注入普通类型属性。
(1)我们在 UserService
类中,添加一个 username
属性,并用 @Value
注解注入 张三
。
@Service(value = "userService")
public class UserService {
@Value(value = "张三")
private String username;
@Autowired
@Qualifier(value = "hjc")
private UserDao userDao;
public void addUser() {
System.out.println("service add......");
System.out.println(username);
userDao.addUser();
}
}
(2)测试