Spring framework 笔记

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

  1. @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属性的方法。

demo地址JavaEE开发的颠覆者Spring Boot demo升级练习

你可能感兴趣的:(Spring framework 笔记)