Spring中的世界,一切皆 Bean,那么就先介绍多种向 Spring 中添加 Bean 的方式。

一、Bean 标签形式

1)定义User实体

public class User {

private Long id;

private String name;

public User() {
System.out.println(this.getClass().getName() + " 中的空参构造器被调用...");
}
// 省略get,set方法
}

2)配置 spring-service.xml 文件

<bean class="cn.j3code.studyspring.entity.User" name="user">
<property name="id" value="100"/>
<property name="name" value="张三"/>
</bean>

3)测试

public class StudySpringMain {

public static void main(String[] args) {
// 读取配置文件启动
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-service.xml");

User bean = applicationContext.getBean(User.class);
System.out.println(bean);
}
}

二、Bean注解形式

1)定义UserB实体

public class UserB {

private Long id;

private String name;

public UserB() {
System.out.println(this.getClass().getName() + " 中的空参构造器被调用...");
}
// 省略get,set方法
}

2)编写 StudySpringConfiguration 配置类

@Configuration
public class StudySpringConfiguration {

@Bean
public UserB userB() {
UserB user = new UserB();
user.setId(200L);
user.setName("李四");
return user;
}
}

3)测试

public class StudySpringMain {

public static void main(String[] args) {
// 读取配置文件启动
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-service.xml");

UserB bean = applicationContext.getBean(UserB.class);
System.out.println(bean);
}
}

三、@ComponentScan + @Component 形式

1)定义 UserServiceImpl 实体,并加上 @Service 注解(他继承了 @Component 注解)

@Service
public class UserServiceImpl {

public UserServiceImpl() {
System.out.println(this.getClass().getName() + " 中的空参构造器被调用...");
}
}

2)配置文件 spring-service.xml 已经配置了包扫描标签

<context:component-scan base-package="cn.j3code.studyspring"/>

这个与下面功能一样

@Configuration
@ComponentScan(value = "cn.j3code.studyspring")
public class StudySpringConfiguration {
}

3)测试

public class StudySpringMain {

public static void main(String[] args) {
// 读取配置文件启动
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-service.xml");

UserServiceImpl bean = applicationContext.getBean(UserServiceImpl.class);
System.out.println(bean);
}
}

四、@Import 导入形式

1)定义 UserBServiceImpl 实体

public class UserBServiceImpl  {

public UserServiceImpl() {
System.out.println(this.getClass().getName() + " 中的空参构造器被调用...");
}
}

2)在配置类上加入 @Import

@Configuration
@Import(value = {UserBServiceImpl.class})
public class StudySpringConfiguration {
}

3)测试

public class StudySpringMain {

public static void main(String[] args) {
// 读取配置文件启动
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-service.xml");

UserBServiceImpl bean = applicationContext.getBean(UserBServiceImpl.class);
System.out.println(bean);
}
}

五、@Import + ImportSelector 接口形式

1)定义 UserCServiceImpl 实体

public class UserCServiceImpl   {

public UserServiceImpl() {
System.out.println(this.getClass().getName() + " 中的空参构造器被调用...");
}
}

2)编写 MyImportSelector 类实现 ImportSelector 接口

public class MyImportSelector implements ImportSelector {

@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// 将 Bean 的全限定类名传进入
return new String[]{"cn.j3code.studyspring.service.UserCServiceImpl"};
}
}

3)配指 @Import 注解

@Configuration
@Import(value = {MyImportSelector.class})
public class StudySpringConfiguration {
}

4)测试

public class StudySpringMain {

public static void main(String[] args) {
// 读取配置文件启动
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-service.xml");

UserCServiceImpl bean = applicationContext.getBean(UserCServiceImpl.class);
System.out.println(bean);
}
}

六、@Import + ImportBeanDefinitionRegistrar 接口形式

1)定义 UserC 实体

public class UserC {

private Long id;

private String name;

public UserC () {
System.out.println(this.getClass().getName() + " 中的空参构造器被调用...");
}
// 省略get,set方法
}

2)定义 MyImportBeanDefinitionRegistrar 类实现 ImportBeanDefinitionRegistrar 接口

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
registry.registerBeanDefinition("userC", new RootBeanDefinition(UserC.class));
}
}

3)配指 @Import 注解

@Configuration
@Import(value = {MyImportBeanDefinitionRegistrar.class})
public class StudySpringConfiguration {
}

4)测试

public class StudySpringMain {

public static void main(String[] args) {
// 读取配置文件启动
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-service.xml");

UserC bean = applicationContext.getBean(UserC.class);
System.out.println(bean);
}
}

七、对比 Bean 与 Import 导入的区别

以上常规 Bean 的形式导入组件和 Import 形式导入组件有什么不一样,或者说 Import 形式导入用在什么场景。

1、通常开发的时候用常规 Bean 的形式就可以了

2、Import 形式导入只用于第三方组件导入,因为第三方类我们不能给其类上加 @Component 相关注解,所以若要使用第三方组件功能,就只能使用 Import 形式导入。

3、这里的考虑是忽略了 xml 配置文件的形式导入,因为以后开发都基本是注解式开发

八、FactoryBean 形式

1)编写实体 UserD

public class UserD {

private Long id;

private String name;

public UserD () {
System.out.println(this.getClass().getName() + " 中的空参构造器被调用...");
}
// 省略get,set方法
}

2)编写 MyFactoryBean 并实现 FactoryBean 接口

public class MyFactoryBean implements FactoryBean<UserD> {
@Override
public UserD getObject() throws Exception {
UserD userD = new UserD();
userD.setId(500L);
userD.setName("j3code");
return userD;
}

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

@Override
public boolean isSingleton() {
return true;
}
}

4)配置 MyFactoryBean

@Configuration
public class StudySpringConfiguration {
@Bean
public MyFactoryBean myFactoryBean() {
return new MyFactoryBean();
}
}

3)测试

public class StudySpringMain {

public static void main(String[] args) {
// 读取配置文件启动
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-service.xml");

UserD bean = applicationContext.getBean(UserD.class);
System.out.println(bean);
System.out.println(applicationContext.getBean("myFactoryBean"));
System.out.println(applicationContext.getBean("&myFactoryBean"));
}
}

注:myFactoryBean 与 &myFactoryBean 获取 Bean 的区别

​好了,今天的内容到这里就结束了,我是 【J3】关注我,我们下期见​​。


  • 由于博主才疏学浅,难免会有纰漏,假如你发现了错误或偏见的地方,还望留言给我指出来,我会对其加以修正。
  • 如果你觉得文章还不错,你的转发、分享、点赞、留言就是对我最大的鼓励。
  • 感谢您的阅读,十分欢迎并感谢您的关注。