日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

基于配置類方式管理Bean

作者:W-琑 更新時間: 2024-03-07 編程語言

目錄

1.完全注解開發(fā)理解

2.實驗一:配置類和掃描注解

3.實驗二:@Bean定義組件

4.實驗三:高級特性:@Bean注解細(xì)節(jié)

5.實驗四:高級特性@Import擴(kuò)展

6.總結(jié)

1)XML方式配置總結(jié)

2)XML+注解方式配置總結(jié)

3)完全注解方式配置總結(jié)


1.完全注解開發(fā)理解

Spring 完全注解配置(Fully Annotation-based Configuration)是指通過 Java配置類 代碼來配置 Spring 應(yīng)用程序,使用注解來替代原本在 XML 配置文件中的配置。相對于 XML 配置,完全注解配置具有更強(qiáng)的類型安全性和更好的可讀性。

兩種方式思維轉(zhuǎn)換

2.實驗一:配置類和掃描注解

使用xml+注解方式與配置類+注解方式時,測試創(chuàng)建IoC容器的寫法區(qū)別:

 // xml方式配置文件使用ClassPathXmlApplicationContext容器讀取
 ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("application.xml");


// AnnotationConfigApplicationContext 根據(jù)配置類創(chuàng)建 IOC 容器對象
ApplicationContext iocContainerAnnotation = 
new AnnotationConfigApplicationContext(MyConfiguration.class);


//可以使用 no-arg 構(gòu)造函數(shù)實例化 AnnotationConfigApplicationContext ,然后使用 register() 方法對其進(jìn)行配置。此方法在以編程方式生成 AnnotationConfigApplicationContext 時特別有用。以下示例演示如何執(zhí)行此操作:
// AnnotationConfigApplicationContext-IOC容器對象
ApplicationContext iocContainerAnnotation = 
new AnnotationConfigApplicationContext();
//外部設(shè)置配置類
iocContainerAnnotation.register(MyConfiguration.class);
//刷新后方可生效?。?iocContainerAnnotation.refresh();

總結(jié):

@Configuration指定一個類為配置類,可以添加配置注解,替代配置xml文件

@ComponentScan(basePackages = {"包","包"}) 替代<context:component-scan標(biāo)簽實現(xiàn)注解掃描

@PropertySource("classpath:配置文件地址") 替代 <context:property-placeholder標(biāo)簽

配合IoC/DI注解,可以進(jìn)行完整注解開發(fā)!

3.實驗二:@Bean定義組件

場景需求:將Druid連接池對象存儲到IoC容器

需求分析:第三方j(luò)ar包的類,添加到ioc容器,無法使用@Component等相關(guān)注解!因為源碼jar包內(nèi)容為只讀模式!

配置類方式實現(xiàn):

@Bean注釋用于指示方法實例化、配置和初始化要由 Spring IoC 容器管理的新對象。對于那些熟悉 Spring 的 <beans/>XML 配置的人來說, @Bean?注釋與 <bean/>?元素起著相同的作用。

//標(biāo)注當(dāng)前類是配置類,替代application.xml    
@Configuration
//引入jdbc.properties文件
@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})
@ComponentScan(basePackages = {"com.atguigu.components"})
public class MyConfiguration {

    //如果第三方類進(jìn)行IoC管理,無法直接使用@Component相關(guān)注解
    //解決方案: xml方式可以使用<bean標(biāo)簽
    //解決方案: 配置類方式,可以使用方法返回值+@Bean注解
    @Bean
    public DataSource createDataSource(@Value("${jdbc.user}") String username,
                                       @Value("${jdbc.password}")String password,
                                       @Value("${jdbc.url}")String url,
                                       @Value("${jdbc.driver}")String driverClassName){
        //使用Java代碼實例化
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        //返回結(jié)果即可
        return dataSource;
    }
}

4.實驗三:高級特性:@Bean注解細(xì)節(jié)

@Bean生成BeanName問題:

@Bean注解源碼:

public @interface Bean {
    //前兩個注解可以指定Bean的標(biāo)識
    @AliasFor("name")
    String[] value() default {};
    @AliasFor("value")
    String[] name() default {};
  
    //autowireCandidate 屬性來指示該 Bean 是否候選用于自動裝配。
    //autowireCandidate 屬性默認(rèn)值為 true,表示該 Bean 是一個默認(rèn)的裝配目標(biāo),
    //可被候選用于自動裝配。如果將 autowireCandidate 屬性設(shè)置為 false,則說明該 Bean 不是默認(rèn)的裝配目標(biāo),不會被候選用于自動裝配。
    boolean autowireCandidate() default true;

    //指定初始化方法
    String initMethod() default "";
    //指定銷毀方法
    String destroyMethod() default "(inferred)";
}

`@Bean` 注釋注釋方法。使用此方法在指定為方法返回值的類型的 `ApplicationContext` 中注冊 Bean 定義。缺省情況下,Bean 名稱與方法名稱相同。下面的示例演示 `@Bean` 方法聲明:

@Configuration
public class AppConfig {

  @Bean
  public TransferServiceImpl transferService() {
    return new TransferServiceImpl();
  }
}

指定@Bean的名稱:

@Configuration
public class AppConfig {

  @Bean("myThing") //指定名稱
  public Thing thing() {
    return new Thing();
  }
}

@Bean初始化和銷毀方法指定

2.周期方法的問題  ---  1)和以前一樣用@PostConstruct和@PreDestroy  2)用@Bean的屬性initMethod和destroyMethod
public class BeanOne {

  public void init() {
    // initialization logic
  }
}

public class BeanTwo {

  public void cleanup() {
    // destruction logic
  }
}

@Configuration
public class AppConfig {

  @Bean(initMethod = "init")
  public BeanOne beanOne() {
    return new BeanOne();
  }

  @Bean(destroyMethod = "cleanup")
  public BeanTwo beanTwo() {
    return new BeanTwo();
  }
}

@Bean Scope作用域

作用域  ---  和以前一樣  @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)

如何引用其他的IoC組件

方案1:

直接調(diào)用方法返回 Bean 實例:在一個 `@Bean` 方法中直接調(diào)用其他 `@Bean` 方法來獲取 Bean 實例,雖然是方法調(diào)用,也是通過IoC容器獲取對應(yīng)的Bean,例如:

@Configuration
public class JavaConfig {

    @Bean
    public HappyMachine happyMachine(){
        return new HappyMachine();
    }

    @Bean
    public HappyComponent happyComponent(){
        HappyComponent happyComponent = new HappyComponent();
        //直接調(diào)用方法即可! 
        happyComponent.setHappyMachine(happyMachine());
        return happyComponent;
    }

}

方案二:

參數(shù)引用法:通過方法參數(shù)傳遞 Bean 實例的引用來解決 Bean 實例之間的依賴關(guān)系,例如:

package com.atguigu.config;

import com.atguigu.ioc.HappyComponent;
import com.atguigu.ioc.HappyMachine;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * projectName: com.atguigu.config
 * description: 配置HappyComponent和HappyMachine關(guān)系
 */

@Configuration
public class JavaConfig {

    @Bean
    public HappyMachine happyMachine(){
        return new HappyMachine();
    }

    /**
     * 可以直接在形參列表接收IoC容器中的Bean!
     *    情況1: 直接指定類型即可
     *    情況2: 如果有多個bean,(HappyMachine 名稱 ) 形參名稱等于要指定的bean名稱!
     *           例如:
     *               @Bean
     *               public Foo foo1(){
     *                   return new Foo();
     *               }
     *               @Bean
     *               public Foo foo2(){
     *                   return new Foo()
     *               }
     *               @Bean
     *               public Component component(Foo foo1 / foo2 通過此處指定引入的bean)
     */
    @Bean
    public HappyComponent happyComponent(HappyMachine happyMachine){
        HappyComponent happyComponent = new HappyComponent();
        //賦值
        happyComponent.setHappyMachine(happyMachine);
        return happyComponent;
    }

}

5.實驗四:高級特性@Import擴(kuò)展

@Import 注釋允許從另一個配置類加載 @Bean 定義,如以下示例所示:

@Configuration
public class ConfigA {

  @Bean
  public A a() {
    return new A();
  }
}

@Configuration
@Import(ConfigA.class)
public class ConfigB {

  @Bean
  public B b() {
    return new B();
  }
}

現(xiàn)在,在實例化上下文時不需要同時指定 `ConfigA.class` 和 `ConfigB.class` ,只需顯式提供 `ConfigB` ,如以下示例所示:

public static void main(String[] args) {
  ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigB.class);

  // now both beans A and B will be available...
  A a = ctx.getBean(A.class);
  B b = ctx.getBean(B.class);
}

6.總結(jié)

1)XML方式配置總結(jié)

1. 所有內(nèi)容寫到xml格式配置文件中
2. 聲明bean通過<bean標(biāo)簽
3. <bean標(biāo)簽包含基本信息(id,class)和屬性信息 <property name value / ref
4. 引入外部的properties文件可以通過<context:property-placeholder
5. IoC具體容器實現(xiàn)選擇ClassPathXmlApplicationContext對象

2)XML+注解方式配置總結(jié)

1. 注解負(fù)責(zé)標(biāo)記IoC的類和進(jìn)行屬性裝配
2. xml文件依然需要,需要通過<context:component-scan標(biāo)簽指定注解范圍
3. 標(biāo)記IoC注解:@Component,@Service,@Controller,@Repository?
4. 標(biāo)記DI注解:@Autowired @Qualifier @Resource @Value
5. IoC具體容器實現(xiàn)選擇ClassPathXmlApplicationContext對象

3)完全注解方式配置總結(jié)

1. 完全注解方式指的是去掉xml文件,使用配置類 + 注解實現(xiàn)
2. xml文件替換成使用@Configuration注解標(biāo)記的類
3. 標(biāo)記IoC注解:@Component,@Service,@Controller,@Repository?
4. 標(biāo)記DI注解:@Autowired @Qualifier @Resource @Value
5. <context:component-scan標(biāo)簽指定注解范圍使用@ComponentScan(basePackages = {"com.atguigu.components"})替代
6. <context:property-placeholder引入外部配置文件使用@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})替代
7. <bean 標(biāo)簽使用@Bean注解和方法實現(xiàn)
8. IoC具體容器實現(xiàn)選擇AnnotationConfigApplicationContext對象

原文鏈接:https://blog.csdn.net/weixin_69134926/article/details/136459312

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新