Bean的创建方式

目录

学习背景

前言

Bean的创建

配置

创建方式

@Component

@Bean

@Import(误)

ApplicationContextAware(误)

BeanFactoryPostProcessor(误)

FactoryBean(误)

总结

学习背景

地点:长沙欧富安科技园1栋5楼飞思项目十

时间:2023/09/11~15

大致内容:Spring

前言

一波三折

Bean的创建

配置

pom.xml

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring.version>5.2.4.RELEASE</spring.version>
  </properties>

  <dependencies>
    <!--日志打印依赖1-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.22</version>
      <!--      <scope>provided</scope>-->
    </dependency>
    <!--日志打印依赖2-->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.1.8</version>
      <!--      <scope>provided</scope>-->
    </dependency>
    <!--日志打印依赖3-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.2</version>
      <!--      <scope>provided</scope>-->
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- spring依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
    <dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.3.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.6</version>
    </dependency>

    <!--数据库依赖-->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>

      <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.6</version>
      </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

  </dependencies>

创建方式

@Component

在要创建bean的类上配置一个@Component注释

@Component
public class AService {
    public AService(){
        System.out.println("AService:" + this);
    }
}

@Bean

创建一个该类的方法,new出来并返回,再在该方法上面使用@Bean注释,来实现bean的创建

    @Bean
    public AService aService(){
        return new AService();
    }

@Import(误)

通过在配置类中设置@Import(指定类.class)注释来实现bean的创建,但这种方法不太适合一般类bean的创建

@Import(AService.class)
public class AppConfig {

}

ApplicationContextAware(误)

实现ApplicationContextAware接口(单例池)

(!!!不推荐,或者说过于麻烦,这种实现bean创建的方式,在这里只是介绍一下,强烈不推荐在实际开发中使用这种方式!!!)

1.首先要确保该类能被Spring检测到。

2.创建一个DefaultListableBeanFactory对象,再通过调用applicationContext.getAutowireCapableBeanFactory()方法,可以获取当前应用程序上下文的AutowireCapableBeanFactory实例。

3.再将其强转为它的子类DefaultListableBeanFactory,并调用子类中特有的方法registerSingleton。

4.再根据方法的要求,我们我们需要new一个对象,再将对象名和对象当做参数放到方法中,用来实现bean的实例化。

@Component
public class MyApplicationContextAware implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
        AService aService = new AService();
        defaultListableBeanFactory.registerSingleton("AService",aService);

    }
}

BeanFactoryPostProcessor(误)

实现 BeanFactoryPostProcessor接口(beanDefinition)

(!!!这个貌似也可以实现bean的创建,但从事Spring多年的恩师听都没听过,所以和上例一样非常不推荐在实际中使用,可我觉得还是要写一下,用以警示自己!!!)

1.首先要确保该类能被Spring检测到。

2.创建一个DefaultListableBeanFactory对象,用来获取ConfigurableListableBeanFactory的实例,再将其强转为DefaultListableBeanFactory。

3.创建一个GenericBeanDefinition对象。

4.调用GenericBeanDefinition中的setBeanClass方法,将指定类的反射当做参数填入方法中。

5.调用DefaultListableBeanFactory中的registerBeanDefinition方法,将类名和GenericBeanDefinition对象传递过去,进而实现bean的实例化。

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory)configurableListableBeanFactory;
        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
        genericBeanDefinition.setBeanClass(AService.class);
        defaultListableBeanFactory.registerBeanDefinition("AService",genericBeanDefinition);
    }
}

FactoryBean(误)

实现FactoryBean接口(自己创建)

(!!!也不推荐在实际开发中使用!!!)

@Component
public class MyFactoryBean implements FactoryBean<AService> {
    @Override
    public AService getObject() throws Exception {
        AService aService = new AService();
        return aService;
    }

    @Override
    public Class<?> getObjectType() {
        return AService.class;
    }
}

总结

失败是成功之母

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值