/** * 自動裝配; * Spring利用依賴注入(DI),完成對IOC容器中中各個組件的依賴關係賦值; * * 1)、@Autowired:自動注入: * 1)、默認優先按照類型去容器中找對應的組件:applicationContext.getBean(BookDao.class);找到就賦值 * 2)、若是找到多個相同類型的組件,再將屬性的名稱做爲組件的id去容器中查找 * applicationContext.getBean("bookDao") * 3)、@Qualifier("bookDao"):使用@Qualifier指定須要裝配的組件的id,而不是使用屬性名 * 4)、自動裝配默認必定要將屬性賦值好,沒有就會報錯; * 能夠使用@Autowired(required=false); * 5)、@Primary:讓Spring進行自動裝配的時候,默認使用首選的bean; * 也能夠繼續使用@Qualifier指定須要裝配的bean的名字 * BookService{ * @Autowired * BookDao bookDao; * } * * 2)、Spring還支持使用@Resource(JSR250)和@Inject(JSR330)[java規範的註解] * @Resource: * 能夠和@Autowired同樣實現自動裝配功能;默認是按照組件名稱進行裝配的; * 沒有能支持@Primary功能沒有支持@Autowired(reqiured=false); * @Inject: * 須要導入javax.inject的包,和Autowired的功能同樣。沒有required=false的功能; * @Autowired:Spring定義的; @Resource、@Inject都是java規範 * * AutowiredAnnotationBeanPostProcessor:解析完成自動裝配功能; * * 3)、 @Autowired:構造器,參數,方法,屬性;都是從容器中獲取參數組件的值 * 1)、[標註在方法位置]:@Bean+方法參數;參數從容器中獲取;默認不寫@Autowired效果是同樣的;都能自動裝配 * 2)、[標在構造器上]:若是組件只有一個有參構造器,這個有參構造器的@Autowired能夠省略, * 參數位置的組件仍是能夠自動從容器中獲取 * 3)、放在參數位置: * * 4)、自定義組件想要使用Spring容器底層的一些組件(ApplicationContext,BeanFactory,xxx); * 自定義組件實現xxxAware;在建立對象的時候,會調用接口規定的方法注入相關組件;Aware; * 把Spring底層一些組件注入到自定義的Bean中; * xxxAware:功能使用xxxProcessor; * ApplicationContextAware==》ApplicationContextAwareProcessor; */ @Configuration @ComponentScan({"com.atguigu.service","com.atguigu.dao", "com.atguigu.controller","com.atguigu.bean"}) public class MainConifgOfAutowired { @Primary @Bean("bookDao2") public BookDao bookDao(){ BookDao bookDao = new BookDao(); bookDao.setLable("2"); return bookDao; } /** * @Bean標註的方法建立對象的時候,方法參數的值從容器中獲取 * @param car * @return */ @Bean public Color color(Car car){ Color color = new Color(); color.setCar(car); return color; } }