spring的依赖注入(DI)、控制反转(IOC)和面向切面(AOP)
在spring的配置文件增加
<context:component-scan base-package="com.jmu.ccjoin.service"/>
<context:annotation-config />
spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描到文件中带有@Service,@Component,@Repository,@Controller等这些注解的类,则把这些类注册为bean
而
@Service注解、
@Controller注解以及
@Repository注解都是把
spring容器中的
bean进行实例化,也就是等同于
new操作,只有
实现类是可以进行
new实例化的,而
接口则不能,所以是加在
实现类上的。
1 public interface UserService { 2 3 /** 4 * 根据ID获取用户信息 5 * 6 * @param id 7 * @return 8 */ 9 void get(Long id); 10 }
1 public interface BuyerService { 2 3 void get(); 4 }
1 @Service 2 public class BuyerServiceImpl implements BuyerService { 3 4 @Override 5 public void get() { 6 System.out.println("buyer landing..."); 7 } 8 9 }
1 @Service 2 public class UserServiceImpl implements UserService { 3 4 //没有UserDao类型注入到spring容器成bean 5 // @Autowired 6 // private UserDao userDao; 7 8 @Autowired 9 private BuyerService buyerService; 10 11 public void get(Long id) { 12 buyerService.get(); 13 System.out.println("userServiceImpl run sucess!!"); 14 } 15 }
1 public static void main(String[] args) { 2 3 ApplicationContext app = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); 4 UserController userController = (UserController) app.getBean("userController"); 5 userController.save(); 6 7 System.out.println("----------------------------------"); 8 9 UserServiceImpl userServiceImpl = (UserServiceImpl)app.getBean("userServiceImpl"); 10 userServiceImpl.get(1L); 11 12 System.out.println("----------------------------------"); 13 //userServiceImpl有注入到Spring容器,而userService并未注入到spring容器 14 UserService userService = (UserService)app.getBean("userServiceImpl"); 15 userService.get(1L); 16 }
注意:userServiceImpl和userService的类型都是userService,而userService并未在spring注册成bean,所以userService类型只能取到userServiceImpl
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false
DI依赖注入:只需要依赖spring-context包,依赖注入的是接口的话,接口一定要有实现。
IOC控制反转:本来交给调用方new的,现在交给spring创建,并注入到调用方,控制方发生了反转。其实控制反转和依赖注入讲的是一回事儿。
AOP面向切面:其应用如动态代理--要执行的方法,交给spring代理执行,并在调用方法前后加入其它逻辑。
另外:
IOC能够被分解为两种子类型:依赖注入和依赖查找。
(1) 依赖查找
比如使用 JNDI 注册一个数据库连接池的示例中,代码中从注册处获得依赖关系的 JNDI 查找 (JNDI lookups):
CODE:
initContext = new InitialContext();
// 获取数据源
DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/mysql");
(2) 依赖注入
依赖注入的三种实现类型:接口注入、 Setter 注入和构造器注入。
- Spring 之 控制反转(IoC), 依赖注入(DI)和面向切面(AOP)
- Spring学习,依赖注入(DI)、控制反转(IoC)和面向切面(AOP)
- Spring控制反转(IOC)和依赖注入(DI),再记不住就去出家!
- 如何理解Spring的控制反转IOC和依赖注入DI思想
- Helloworld之Spring依赖注入/控制反转(DI/IoC)版
- Spring_mvc ioc/DI 控制反转与依赖注入
- spring的Ioc控制反转和DI依赖注入讲解
- Spring框架运行机制(控制反转,依赖注入,面向切面AOP)
- spring、IoC控制反转和DI依赖注入入门、基于XML的Bean装配、基于注解的Bean装配
- 【spring进阶】--控制反转(IoC)和依赖注入(DI)
- Spring学习(1):控制反转(IoC)和依赖注入(DI)的详解以及注解(annotation)开发入门案例
- 利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI)
- Spring学习一:IOC(控制反转)和AOP(面向切面)的xml配置和注解方式
- idea 实现Spring讲解(Ioc-控制反转)/Aop(面向切面的编程)
- Spring原理机制资源汇总(控制反转(IoC)与依赖注入(DI)主题)
- Spring的依赖注入(DI)和控制反转(IOC)
- Spring.Net-DI依赖注入和Ioc控制反转
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring.net 控制反转(IOC)依赖注入(DI)的使用 以及Config文件的配置
- Spring 控制反转IOC,依赖注入DI