目录
学习背景
前言
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;
}
}
总结
失败是成功之母