1.依赖注入(Dependency Injection)是控制反转(Inversion of control)的一种实现形式
2.JNDI Java Naming and Directory Interface java命名和目录服务接口(后期继续了解,一知半解)
3.EJB,JMX,POJO,Portlet
4.注入bean方式
- 注解方式注入 @Service @Component...(需要@ComponentScan 扫描装载)
- java配置 @Bean形式装载
5.实现aop
@Pointcut("@annotation(com.shang.spring.learn.aop.Action)") public void annotationPoinCut(){} //插入切入点
@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注解配置开启aop
6.el @Value
7.bean生命周期
- @Bean(initMethod = "init",destroyMethod = "destory")
- @PostConstruct @PreDestory
- @Scope 配置bean的生成策略(单例等)
9.@Profile指定环境context.getEnvironment().setActiveProfiles("prod");设置prod环境
10.event 订阅-通知
- 创建evnet 继承ApplicationEvent
- 创建listerner 实现ApplicationListener
- 创建publisher 注入applicationContext applicationContext.publishEvent(new Event(this))
11.开启异步需要使用@EnableAsync注解进行配置,同时实现AsyncConfigurer接口,返回一个线程池,需要异步执行的方法需要@Async
12.开启计划任务需要@EnableScheduling注解进行配置,一般需要TaskScheduler bean,通过@Scheduled注解标识定时任务,支出多种参数,支持corn
13.@Conditional注解,根据condition条件实例化bean
- 先创建condition条件 实现Condition接口
- 创建公共接口,根据不同条件实现这一接口
- @Conditional(WindowsCondition.class)参数为Condition的类类型,返回bean
14.组合注解,组合注解会覆盖组合注解引入的注解的参数(key要一致,使用@AliasFor注解的参数要全部覆盖,为什么呢还有待商榷)
15.@ComponentScan注解默认扫描当前包
16.以注解的方式实现@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;
}
}
- 实现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()};
}
}
- 实现ImportBeanDefinitionRegistrar
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(RegisterDefinitionRegistor.class)
public @interface RegisterConfigAnnotation {
String value() default "默认";
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);
//添加构造参数(顺序添加)
definitionBuilder.addConstructorArgValue(name);
registry.registerBeanDefinition("registerBean", definitionBuilder.getBeanDefinition());
}
}
目前看后两种方式区别就是最后一种方式可以手动控制装载bean的属性,可以使用含参的构造方法。前一种方式目前没看到可以调用含参构造器的方法,也没看见可以修改bean属性的方法。