Spring注解开发
Spring注解开发
注册组件
@Configuration中配置@Bean注册组件
实体类
public class User {
private int id;
private String name;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public User() {
}
public User(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
配置类
@Configuration
public class MyConfiguration {
@Bean
public User user() {
return new User();
}
}
测试类
public class Mytest {
private ApplicationContext applicationContext
= new AnnotationConfigApplicationContext(com.annotation.config.MyConfiguration.class);
@Test
public void test01() {
// 按名称
// User user = (User) applicationContext.getBean("user");
// 按类型
User user = applicationContext.getBean(User.class);
System.out.println(user);
}
}
利用@ComponentScan扫描注册
配置类
@Configuration
@ComponentScan(
// 扫描的包
value = "com.annotation",
// 排除
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Service.class})},
// 只包含(需要禁用默认规则)
useDefaultFilters = false,
includeFilters = {
// 按照注解
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
// 按照类型
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {UserController.class}),
// 可以自定义Filter
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
}
)
public class MyConfiguration {
}
自定义过滤器类
// 实现TypeFilter
public class MyTypeFilter implements TypeFilter {
/**
* @param metadataReader 可以获取到当前正在扫描类的信息
* @param metadataReaderFactory 可以获取到其他类的信息
* @return 返回值为布尔值,true为成功,false失败
* @throws IOException
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
// 获取当前类注解信息
AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
// 获取当前类的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
// 获取当前类的资源信息(路径)
Resource resource = metadataReader.getResource();
String className = classMetadata.getClassName();
// 如果类名包含er则返回true
if (className.contains("er")) {
return true;
}
return false;
}
}
组件类
@Controller
public class UserController {
}
测试类
@Test
public void test02() {
UserController userController = (UserController) applicationContext.getBean("userController");
System.out.println(userController);
}
使用@Conditional条件注册
配置类
@Configuration
public class MyConfiguration {
@Conditional({FalseCondition.class})
@Bean
public User tom() {
return new User(1, "tom");
}
// 参数为Condition数组
@Conditional({TrueCondition.class})
@Bean
public User jack() {
return new User(2, "jack");
}
}
Condition类
public class TrueCondition implements Condition {
/**
* @param context 上下文环境
* @param metadata 注释信息
* @return
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 获取到BeanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
// 获取到类加载器
ClassLoader classLoader = context.getClassLoader();
// 获取到环境
Environment environment = context.getEnvironment();
// 获取到bean定义的注册类
BeanDefinitionRegistry registry = context.getRegistry();
return true;
}
}
public class FalseCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}
测试类
@Test
public void test03() {
Map<String, User> beans = applicationContext.getBeansOfType(User.class);
System.out.println(beans);
}
未完待续,更新ing