============== Spring自动布线 ============== 1 什么是自动布线 ________ ________ | | | | | 环境 |--管理->| | |________| | | | | | 注入 | 对象 | | | | ____V___ | | | | | | |应用程序|--使用->| | |________| |________| - 应用程序为了完成特定任务需要依赖于特定的对象 - 环境负责管理(控制)这些为应用程序所依赖的对象 - 应用程序可以通过两种方式得到环境中的特定对象 - 主动过去拿——获取 - 被动等着给——注入 所谓依赖注入,就是由环境(容器)将应用程序所依赖的对象注入其中。 Spring通过自动布线(也叫自动装配),简化了对依赖注入的配置过程。 // 第一个Bean类 public class HelloBean { @Override public String toString() { return "Hello Bean"; } } // 第二个Bean类,使用第一个Bean public class Worker { public HelloBean helloBean; public void work() { System.out.println(helloBean); } } // 配置类 @Configuration public class Config { // 创建第一个Bean的方法 @Bean public HelloBean helloBean() { return new HelloBean(); --> Spring } | | Worker依赖于HelloBean,Spring向其注入 // 创建第二个Bean的方法 | @Bean v public Worker worker(HelloBean helloBean) { Worker worker = new Worker(); // 将第一个Bean注入第二个Bean worker.helloBean = helloBean; return worker; } } 例程:HelloBean 2 查找规则 - 如果容器中没有与注入所需类型匹配的Bean对象,则抛出异常 public class Config { ? @Bean | public Worker worker(HelloBean helloBean) { ... } } - 如果容器中有唯一的与注入所需类型匹配的Bean对象,则注入成功 public class Config { @Bean public HelloBean helloBean() { ... } |_____________ @Bean | public Worker worker(HelloBean helloBean) { ... } } - 如果容器中存在多个与注入所需类型匹配的Bean对象,则根据参数名与Bean对象ID(默认为创建该对象的方法名)的匹配性查找 public class Config { @Bean public HelloBean helloBean1() { ... } @Bean public HelloBean helloBean2() { ... } |_____________ @Bean | public Worker worker(HelloBean helloBean2) { ... } } 3 在组件扫描过程中自动布线 通过给需要被注入的对象添加Autowired注解,可以让Spring在组件扫描的过程中完成自动布线。 package cn.tedu; // 第一个Bean类 @Component public class HelloAutowired { @Override public String toString() { return "Hello Autowired"; } } // 第二个Bean类,使用第一个Bean @Component public class Worker { @Autowired public HelloAutowired helloAutowired; <- 注入 public void work() { System.out.println(helloAutowired); } } // 配置类 @Configuration @ComponentScan(basePackages="cn.tedu") public class Config { } 例程:HelloAutowired