1.依賴注入註解:web
@Component:Bean注入到Spring容器組件(通用)spring
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE):Bean做用域(
SCOPE_PROTOTYPE:每次注入bean就是一個新的Bean
SCOPE_SINGLETON:單例
)
@Repository:標記該類爲Dao數據訪問層app
@Service:標記該類爲Service業務邏輯層ide
@Controller:標記該類爲Controller控制訪問層學習
@Autowired註解:自動裝配bean
使用說明:該註解能夠放在構造方法上,注入屬性上,普通方法上
屬性:required = false(若是該類沒有在Spring容器中則忽略不報錯)
歧義性:@Qualifier做用比@Primary強
/** * Created by 小小高 on 19-7-14 * * 學習Spring bean注入 * @Component註解: * 標記這個類爲組件,進行注入bean * * @Autowired註解:自動裝配bean * 使用說明:該註解能夠放在構造方法上,注入屬性上,普通方法上 */ @Data @Component @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) //@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) public class SpringTestBeanClass { private String name; private Integer age; private String id; @Autowired private SpringBeanSonClass02 springBeanSonClass; // @Autowired/*注入bean到構造方法*/ // public SpringTestBeanClass(SpringBeanSonClass springBeanSonClass){ // this.springBeanSonClass = springBeanSonClass; // } // @Autowired/*注入bean到普通方法*/ // public void setSpringBeanSonClass(SpringBeanSonClass springBeanSonClass){ // this.springBeanSonClass = springBeanSonClass; // } public void pay(){ System.out.println("調用SpringTestBeanClass類的pay方法"); springBeanSonClass.springBeanSonClass02(); } }
@Configuration:標記該類爲配置類ui
* @Configuration註解;聲明該類爲配置類,加載Spring容器
* 使用說明:
* @Configuration註解的配置類有以下要求:
* 1.@Configuration不能夠是final類型;
* 2.@Configuration不能夠是匿名類;
* 3.嵌套的configuration必須是靜態類。
* 加載容器:
* @Configuration配置spring並啓動spring容器
* 1.@Configuration啓動容器+@Bean註冊Bean
* 2.@Configuration啓動容器+@Component註冊Bean
* 3.使用 AnnotationConfigApplicationContext 註冊 AppContext 類的兩種方法
* 4.配置Web應用程序(web.xml中配置AnnotationConfigApplicationContext)
*@ComponentScan註解:告訴Srping須要掃描的包或類,spring自動掃描而且裝入bean容器。
* 使用說明:
* 1.默認規則:
* 是以該配置類所在的包做爲基礎包,會掃描該配置類同級包的類和子包類進行自動掃描裝配
* 2.屬性basePackages:
* 加載基礎掃描包,自動裝配掃描該包和該包的子包
* 3.屬性basePackageClasses:
* 加載自動掃描標記類的同級包和子包的類
* @Bean註解:加載Bean容器實例
/** * Created by 小小高 on 19-7-14 * * @Configuration註解;聲明該類爲配置類,加載Spring容器 * 使用說明: * @Configuration註解的配置類有以下要求: * 1.@Configuration不能夠是final類型; * 2.@Configuration不能夠是匿名類; * 3.嵌套的configuration必須是靜態類。 * 加載容器: * @Configuration配置spring並啓動spring容器 * 1.@Configuration啓動容器+@Bean註冊Bean * 2.@Configuration啓動容器+@Component註冊Bean * 3.使用 AnnotationConfigApplicationContext 註冊 AppContext 類的兩種方法 * 4.配置Web應用程序(web.xml中配置AnnotationConfigApplicationContext) *@ComponentScan註解:告訴Srping須要掃描的包或類,spring自動掃描而且裝入bean容器。 * 使用說明: * 1.默認規則: * 是以該配置類所在的包做爲基礎包,會掃描該配置類同級包的類和子包類進行自動掃描裝配 * 2.屬性basePackages: * 加載基礎掃描包,自動裝配掃描該包和該包的子包 * 3.屬性basePackageClasses: * 加載自動掃描標記類的同級包和子包的類 * @Bean註解:加載Bean容器實例 * */ @Configuration //@ComponentScan(basePackages = {"com.test.xll.spring_demo_study.bean.son"}) @ComponentScan(basePackageClasses = FlagBasePackageClass.class) //@ComponentScan/*默認規則*/ public class SpringBeanDIConfig { @Bean public SpringBeanSonClass springBeanSonClass(){ return new SpringBeanSonClass(); } @Bean public SpringBeanSonClass02 springBeanSonClass02(){ return new SpringBeanSonClass02(); } @Bean @Conditional(DIBeanCondition.class)/*條件注入Bean*/ public DIConditionBean diConditionBean(){ return new DIConditionBean(); } }
@PropertySource:注入外部的值
@Configuration @PropertySource("classpath:app.properties") public class SpringPropertySourceConfig { @Autowired private Environment environment; @Bean public DIPropertySourceBean diPropertySourceBean(){ return new DIPropertySourceBean(environment.getProperty("xll.key"), environment.getProperty("xll.value")); } }
xll.key=key
xll.value=value
@Import註解:this
1.加載注入普通類到Spring容器中spa
2.動態註冊ImportSelectorcode
3.手動註冊ImportBeanDefinitionRegistrarxml
代碼:
/** * Created by 小小高 on 19-7-14 * * @Import註解:注入普通類到Spring容器中 * */ @Configuration @Import(value = {SpringImportStudyBean.class, SelfImportSelector.class, SelfImportBeanDefinitionRegistrar.class}) public class SpringImportStudyConfig { }
** * Created by 小小高 on 19-7-14 * * 學習註解@Import的普通類 */ @Data public class SpringImportStudyBean { private String name = "學習@Import註解使用的Bean類"; }
/** * Created by 小小高 on 19-7-14 * * 學習註解@Import的普通類 */ @Data public class SpringImportSelectprStudyBean { private String name = "學習接口ImportSelector注入Bean類"; }
/** * Created by 小小高 on 19-7-14 */ public class SpringSelfImportBeanDefinitionRegistrarBean { public void print(){ System.out.println("類名:"+Thread.currentThread().getStackTrace()[1].getClassName()); } }
/** * Created by 小小高 on 19-7-14 */ public class SelfImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { //注入普通類到Bean容器 RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(SpringSelfImportBeanDefinitionRegistrarBean.class); beanDefinitionRegistry.registerBeanDefinition("springSelfImportBeanDefinitionRegistrar", rootBeanDefinition); } }
/** * Created by 小小高 on 19-7-14 * * 使用ImportSelector進行注入bean到容器中 */ public class SelfImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata annotationMetadata) { return new String[]{"com.test.xll.spring_demo_study.bean.SpringImportSelectprStudyBean"}; } }