并非所有的
Bean
都会被声明为需要代理,只有被特定的
AOP
切面所切入的
Bean
才会生成
AOP
代理对象。其他非代理的Bean
仍然会作为原始对象被实例化和注入。因此,虽然
Spring
加载的对象确实大部分是通过代理方式生成的AOP
代理对象,但仍然存在一部分对象是原始对象。
例子说明
假设我们有两个
Bean
,分别是
UserService
和
OrderService
。其中,
UserService
需要被
AOP
代理,以实现事务管理的功能,而OrderService
不需要被代理。
在
Spring
的配置中,我们可以通过对
UserService
添加
@Transactional
注解来标明该
Bean
需要生成
AOP代理对象。而对于OrderService
,则不需要做任何特殊的标记,它会作为原始对象被实例化和注入。
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void addUser(User user) {
userDao.addUser(user);
}
// other methods...
}
@Service
public class OrderService {
@Autowired
private OrderDao orderDao;
public void addOrder(Order order) {
orderDao.addOrder(order);
}
// other methods...
}
在上述代码中,
UserService
被标记为
@Service
注解,并且其中的
addUser
方法被标记为@Transactional注解,表示该方法需要被事务管理。因此,
Spring
会为
UserService
生成一个
AOP
代理对象,并在Bean
初始化时将该代理对象注入到其他需要
UserService
依赖的
Bean
中。而OrderService
则没有任何特殊的注解标记,因此
Spring
会将其作为原始对象进行实例化和注入。