Spring framework 筆記

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

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

demo地址JavaEE開(kāi)發(fā)的顛覆者Spring Boot demo升級(jí)練習(xí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,551評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,272評(píng)論 6 342
  • 什么是Spring Spring是一個(gè)開(kāi)源的Java EE開(kāi)發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,771評(píng)論 1 133
  • 《Spring in Action》讀書(shū)筆記和總結(jié)。Spring官網(wǎng): spring.io Spring的底層功能...
    Taeyeon37閱讀 567評(píng)論 0 2
  • 基礎(chǔ)動(dòng)畫(huà),話不多說(shuō),直接來(lái)看例子:UIView *animatView = [[UIView alloc] ini...
    高手世界閱讀 469評(píng)論 0 0

友情鏈接更多精彩內(nèi)容