1.依賴(lài)注入(Dependency Injection)是控制反轉(zhuǎn)(Inversion of control)的一種實(shí)現(xiàn)形式
2.JNDI Java Naming and Directory Interface java命名和目錄服務(wù)接口(后期繼續(xù)了解,一知半解)
3.EJB,JMX,POJO,Portlet
4.注入bean方式
- 注解方式注入 @Service @Component...(需要@ComponentScan 掃描裝載)
- java配置 @Bean形式裝載
5.實(shí)現(xiàn)aop
@Pointcut("@annotation(com.shang.spring.learn.aop.Action)") public void annotationPoinCut(){} //插入切入點(diǎn)
@After("annotationPointCut()")&@Before("annotationPointCut()")定義切片位置,并在此注解下定義function
function如下 MethodSignature signature=(MethodSignature)joinPoint.getSignature();
Method method=signature.getMethod();
Action action=method.getAnnotation(Action.class);
System.out.println("注解攔截器:" +action.name());@EnableAspectJAutoProxy注解配置開(kāi)啟aop
6.el @Value
7.bean生命周期
- @Bean(initMethod = "init",destroyMethod = "destory")
- @PostConstruct @PreDestory
- @Scope 配置bean的生成策略(單例等)
9.@Profile指定環(huán)境context.getEnvironment().setActiveProfiles("prod");設(shè)置prod環(huán)境
10.event 訂閱-通知
- 創(chuàng)建evnet 繼承ApplicationEvent
- 創(chuàng)建listerner 實(shí)現(xiàn)ApplicationListener
- 創(chuàng)建publisher 注入applicationContext applicationContext.publishEvent(new Event(this))
11.開(kāi)啟異步需要使用@EnableAsync注解進(jìn)行配置,同時(shí)實(shí)現(xiàn)AsyncConfigurer接口,返回一個(gè)線程池,需要異步執(zhí)行的方法需要@Async
12.開(kāi)啟計(jì)劃任務(wù)需要@EnableScheduling注解進(jìn)行配置,一般需要TaskScheduler bean,通過(guò)@Scheduled注解標(biāo)識(shí)定時(shí)任務(wù),支出多種參數(shù),支持corn
13.@Conditional注解,根據(jù)condition條件實(shí)例化bean
- 先創(chuàng)建condition條件 實(shí)現(xiàn)Condition接口
- 創(chuàng)建公共接口,根據(jù)不同條件實(shí)現(xiàn)這一接口
- @Conditional(WindowsCondition.class)參數(shù)為Condition的類(lèi)類(lèi)型,返回bean
14.組合注解,組合注解會(huì)覆蓋組合注解引入的注解的參數(shù)(key要一致,使用@AliasFor注解的參數(shù)要全部覆蓋,為什么呢還有待商榷)
15.@ComponentScan注解默認(rèn)掃描當(dāng)前包
16.以注解的方式實(shí)現(xiàn)@Enable*
- 直接import的方式
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ImportConfig.class)
public @interface ImportClassConfigAnnotation {
}
@Configuration
@ComponentScan
public class ImportConfig {
@Bean
public ImportBean getTestBean(){
ImportBean bean=new ImportBean();
bean.setContext("nihao");
return bean;
}
}
- 實(shí)現(xiàn)ImportSelector
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ConditionSelector.class)
public @interface ConditionConfigAnnotation {
String value() default "";
}
public class ConditionSelector implements ImportSelector {
public static String PACKAGE_NAME = "com.shang.spring.learn.enableannotation.";
@Override
public String[] selectImports(final AnnotationMetadata importingClassMetadata) {
Map map = importingClassMetadata.getAnnotationAttributes(ConditionConfigAnnotation.class.getName());
return new String[]{ConditionSelector.PACKAGE_NAME + map.get("value").toString()};
}
}
- 實(shí)現(xiàn)ImportBeanDefinitionRegistrar
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(RegisterDefinitionRegistor.class)
public @interface RegisterConfigAnnotation {
String value() default "默認(rèn)";
String name() default "default";
}
public class RegisterDefinitionRegistor implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(final AnnotationMetadata importingClassMetadata, final BeanDefinitionRegistry registry) {
String context = importingClassMetadata.getAnnotationAttributes(RegisterConfigAnnotation.class.getName()).get("value").toString();
String name = importingClassMetadata.getAnnotationAttributes(RegisterConfigAnnotation.class.getName()).get("name").toString();
BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(RegisterBean.class);
//添加屬性
definitionBuilder.addPropertyValue("context", context);
//添加構(gòu)造參數(shù)(順序添加)
definitionBuilder.addConstructorArgValue(name);
registry.registerBeanDefinition("registerBean", definitionBuilder.getBeanDefinition());
}
}
目前看后兩種方式區(qū)別就是最后一種方式可以手動(dòng)控制裝載bean的屬性,可以使用含參的構(gòu)造方法。前一種方式目前沒(méi)看到可以調(diào)用含參構(gòu)造器的方法,也沒(méi)看見(jiàn)可以修改bean屬性的方法。