国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

寫了兩年代碼之后再來看看Spring中的Bean

PrototypeZ / 1217人閱讀

摘要:一什么是中的簡單來講就是一個個被容器管理的對象,我們寫了一個類之后,這個類只是一個單純的類,可以通過的方式去創建它。以類為例在不指定的情況下,所有的實例都是單實例的,并且是餓漢式加載容器啟動時就創建好了。

(一)什么是Bean

Spring中的Bean簡單來講就是一個個被Spring容器管理的Java對象,我們寫了一個類之后,這個類只是一個單純的Java類,可以通過new的方式去創建它。當我們把這個類添加到Spring的容器里之后,這個類就變成了Bean,由Spring容器管理,可以通過自動注入的方式去使用。

(二)如何往Spring容器中添加Bean

這里列出四種常用的添加Bean的方式。

1、@Bean: 寫一個普通的類時最常用的添加Bean的方式

2、@ComponentScan + @Controller @Service @Component @Repository:SpringBoot寫多了之后一定會很熟悉這些。

3、@Import:通過導入的方式注入Bean

4、@ImportBeanDefinitionRegister:和Import類似,可以指定Bean的名稱

(三)Bean的作用域

首先介紹最基本的@Bean注解,@Bean注解聲明這個類是一個Bean,在Spring5之前,大部分的聲明都會放到配置文件里,Spring5之后通過兩個注解就可以完成。以Teacher類為例

public class Teacher {}@Configurationpublic class MainConfig {    @Bean    public Teacher teacher(){        return new Teacher();    }}

在不指定@Scope的情況下,所有bean的實例都是單實例的bean,并且是餓漢式加載(容器啟動時就創建好了)。可以通過注解@Lazy實現懶加載(在調用時被加載)。

@Bean//@Lazypublic User user(){    return new User();}

指定@Scope為prototype表示為多實例,并且是懶漢式加載(使用時才會創建)

@Bean@Scope(value = "prototype")public User user(){    return new User();}

列出其他的幾種Bean作用域:

singleton  單例(默認)prototype  多實例request  同一次請求session  同一個會話級別

(四)Bean的常用注解

有幾個注解經常會和@Bean一起使用

4.1 Conditional

Conditional注解的意思是條件,即滿足條件的情況下才會生效
比如我在Bean中配置了Conditional:

@Bean@Conditional(value = TeacherCondition.class)public Teacher teacher(){    return new Teacher();}

TeacherCondition 代碼如下:如果Spring的Bean中有名字為student的,則返回true,否則返回false

public class TeacherCondition implements Condition {    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {        if (conditionContext.getBeanFactory().containsBean("student")){            return true;        }        return false;    }}

最后的結果就是,如果TeacherCondition返回的是true,則teacher這個bean會被注冊到容器中,否則就不會注冊到容器中。

4.2 ComponentScan

這個注解會和Controller、Service等同時出現,給一個類添加Controller、Service等注解后,需要在配置類中增加ComponentScan,ComponentScan掃描到的包下的Controller、Service等注解才會生效:

@Configuration//最基本的掃描路徑方式//@ComponentScan(basePackages = {"com.javayz.testcompentscan"})//增加了Filter的方式@ComponentScan(basePackages = {"com.javayz.testcompentscan"},includeFilters = {        @ComponentScan.Filter(type = FilterType.ANNOTATION,value = {Controller.class, Service.class}),        @ComponentScan.Filter(type = FilterType.CUSTOM,value = {TestFilterType.class})},useDefaultFilters = false)public class MainConfig {    @Bean    @Scope(value = "prototype")    public User user(){        return new User();    }}

Filter是在掃描時的過濾器,比如設置FilterType.ANNOTATION表示只有這里設置的注解才會被掃描到,FilterType.CUSTOM是自定義過濾器,TestFilterType 類進行了一層判斷:包名為dao下的類會被注冊到Bean容器中

public class TestFilterType implements TypeFilter {    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {        //獲取當前類的class源信息        ClassMetadata classMetadata = metadataReader.getClassMetadata();        if (classMetadata.getClassName().contains("dao")){            return true;        }        return false;    }}

4.3 @Import

@Import可以用來往容器中導入第三方的組件,也可以起到和@Bean一樣的作用:

@Configuration//@Import(value = {Teacher.class, Student.class})//@Import(value = {MyImportSelector.class})@Import(value = {MyBeanDefinitionRegister.class})public class MainConfig {}

第一種方式直接導入對應的類,這里和直接寫@Bean效果一致

@Import(value = {Teacher.class, Student.class})

第二種方式導入ImportSelector對象,通過selectImports方法返回要導入Bean的全限定名:

public class MyImportSelector implements ImportSelector {    public String[] selectImports(AnnotationMetadata annotationMetadata) {        return new String[]{"com.javayz.testimport.compent.Teacher"};    }}

第三種方式通過BeanDefinitionRegister注入Bean(可以指定Bean的名稱)

public class MyBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Student.class);        registry.registerBeanDefinition("student",rootBeanDefinition);    }}

Import注解最常用的場景就是SpringBoot自動注入,在SpringBoot自動注入源碼中導出可以看到@Import注解的身影。

(五)Bean的初始化和銷毀

當由容器管理Bean的生命周期時,我們可以通過自己指定Bean方法的初始化方法和銷毀方法,使得一個Bean在初始化和銷毀時能執行自己的方法。

1、自定義初始化方法和銷毀方法

public class Teacher {    public Teacher(){        System.out.println("Teacher 構造方法");    }    public void init(){        System.out.println("Teacher 初始化方法");    }    public void destory(){        System.out.println("Teacher 銷毀方法");    }}@Configurationpublic class MainConfig {    @Bean(initMethod = "init",destroyMethod = "destory")    public Teacher teacher(){        return new Teacher();    }}

對于單例bean(singleton)容器啟動的時候,bean對象就創建了,在容器銷毀的時候,就會去調用Bean的銷毀方法。

對于多實例的bean,容器啟動的時候bean還未被創建,在獲取Bean的時候才會被創建,并且bean的銷毀不受IOC容器的管理。

2、通過 InitializingBean, DisposableBean 接口實現

Spring的這兩個接口也可以實現初始化和銷毀的功能。

public class Student implements InitializingBean, DisposableBean {    public Student(){        System.out.println("Student 構造方法");    }    @Override    public void destroy() throws Exception {        System.out.println("Student銷毀");    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("Student初始化");    }}@Configurationpublic class MainConfig {    @Bean    public Student student(){        return new Student();    }}

3、BeanPostProcessor

BeanPostProcessor在所有Bean的初始化前和初始化后都會被調用

@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println("Bean初始化前");        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println("Bean初始化后");        return bean;    }}@ComponentScan@Configurationpublic class MainConfig {    @Bean(initMethod = "init",destroyMethod = "destory")    public Teacher teacher(){        return new Teacher();    }    @Bean    public Student student(){        return new Student();    }}

(六)總結

別看Bean這個概念聽起來簡單,里面的內容還真不少。Spring的核心之一IOC也就是對Bean進行管理。我是魚仔,我們下期再見!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/122169.html

相關文章

  • Spring AOP從零單排-織入時期源分析

    摘要:何為簡單點來定義就是切面,是一種編程范式。定義一個切面的載體定義一個切點定義一個為,并指定對應的切點一個注冊配置類,啟動容器,初始化時期獲取對象,獲取對象時期,并進行打印好了,這樣我們整體的代理就已經完成。 問題:Spring AOP代理中的運行時期,是在初始化時期織入還是獲取對象時期織入? 織入就是代理的過程,指目標對象進行封裝轉換成代理,實現了代理,就可以運用各種代理的場景模式。 ...

    honmaple 評論0 收藏0
  • Spring AOP 源分析系列文章導讀

    摘要:在寫完容器源碼分析系列文章中的最后一篇后,沒敢懈怠,趁熱打鐵,花了天時間閱讀了方面的源碼。從今天開始,我將對部分的源碼分析系列文章進行更新。全稱是,即面向切面的編程,是一種開發理念。在中,切面只是一個概念,并沒有一個具體的接口或類與此對應。 1. 簡介 前一段時間,我學習了 Spring IOC 容器方面的源碼,并寫了數篇文章對此進行講解。在寫完 Spring IOC 容器源碼分析系列...

    張春雷 評論0 收藏0
  • 程序語言

    摘要:一面應該還問了其他內容,但是兩次面試多線程面試問題和答案采訪中,我們通常會遇到兩個主題采集問題和多線程面試問題。多線程是關于并發和線程的。我們正在共享重要的多線程面試問題和答案。。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 【碼農每日一題】Java 內部類(Part 2)相關面試題 關注一下嘛,又不讓你背鍋!問:Ja...

    mtunique 評論0 收藏0
  • 程序語言

    摘要:一面應該還問了其他內容,但是兩次面試多線程面試問題和答案采訪中,我們通常會遇到兩個主題采集問題和多線程面試問題。多線程是關于并發和線程的。我們正在共享重要的多線程面試問題和答案。。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 【碼農每日一題】Java 內部類(Part 2)相關面試題 關注一下嘛,又不讓你背鍋!問:Ja...

    stefan 評論0 收藏0
  • Spring IOC 容器源分析 - 獲取單例 bean

    摘要:簡介為了寫容器源碼分析系列的文章,我特地寫了一篇容器的導讀文章。在做完必要的準備工作后,從本文開始,正式開始進入源碼分析的階段。從緩存中獲取單例。返回以上就是和兩個方法的分析。 1. 簡介 為了寫 Spring IOC 容器源碼分析系列的文章,我特地寫了一篇 Spring IOC 容器的導讀文章。在導讀一文中,我介紹了 Spring 的一些特性以及閱讀 Spring 源碼的一些建議。在...

    lufficc 評論0 收藏0

發表評論

0條評論

PrototypeZ

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<