美文网首页
Spring framework 笔记

Spring framework 笔记

作者: sxqiong | 来源:发表于2017-12-27 15:06 被阅读12次

    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 笔记

          本文链接:https://www.haomeiwen.com/subject/lhokgxtx.html