Bean_1">1. 什么是Bean,如何配置
被spring容器所管理的对象被称为bean,管理方式可以有纯xml文件方式、注解方式进行管理(比如注解@Component)。
在Spring Boot中,在注解 @Component 的基础上,衍生出注解 @Service(专门用于处理业务类的注解)、@Repository(专门用于处理数据访问的注解)。
2. 如何配置bean
Bean_5">2.1 使用注解@Bean
在一个配置类上,定义一个方法,返回值为一个对象的实例化,在这个方法上添加注解@Bean,如下:
package com.lize.demo.dao;
public class UserDao {
public void printUserDao(){
System.out.println("UserDao");
}
}
package com.lize.demo.config;
import com.lize.demo.dao.UserDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConnfig {
@Bean
public UserDao getUserDao(){
return new UserDao();
}
}
单元测试类如下:
package com.lize.demo;
import com.lize.demo.dao.UserDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Autowired
private UserDao ud;
@Test
void contextLoads() {
ud.printUserDao();
}
}
通过@Bean这种方式定义Bean,相比于直接在类上添加注解@component定义Bean。前者返回的是一个实例化对象,可以在这个过程中设置一些参数初始化Bean。
2.2 使用注解@Import
- 需要写在类上;
- 标记的类必须是一个bean,否则不会起作用;
@Component
@Import(UserDao.class)
public class SpringConnfig {
}
上述只是基础写法。另外,可以实现ImportSelector这个接口,并重写其方法selectImports,这个方法返回的是一个字符串数组,字符串数组的值为类的完整路径,进行批量注入Bean,如下:
package com.lize.demo.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{
"com.lize.demo.dao.UserDao"
};
// 返回字符串数组
}
}
@Component
@Import(MyImportSelector.class)
public class SpringConnfig {
}
还有一种写法为,实现ImportBeanDefinitionRegistrar这个接口,并重写其方法registerBeanDefinitions,如下:
package com.lize.demo.config;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
RootBeanDefinition definition = new RootBeanDefinition();
definition.setBeanClassName("com.lize.demo.dao.UserDao");
registry.registerBeanDefinition("UserDao",definition);
}
}
package com.lize.demo.config;
import com.lize.demo.dao.UserDao;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;
@Component
@Import(MyImportBeanDefinitionRegister.class)
public class SpringConnfig {
}