一个人可以做网站吗,网站群建设 中标,做电影网站违法,网站建设管理 优帮云文章目录1、组件注解2、Component Bean3、Import(PlaceHolderClass)快速导入一个组件4、使用Spring提供的FactoryBean注入1、组件注解
注解描述Component组件定义不清晰时候的注解Controller控制器层Service服务层Repository数据层
注#xff1a;添加注解的类需要与启动类在…
文章目录1、组件注解2、Component Bean3、Import(PlaceHolderClass)快速导入一个组件4、使用Spring提供的FactoryBean注入1、组件注解
注解描述Component组件定义不清晰时候的注解Controller控制器层Service服务层Repository数据层
注添加注解的类需要与启动类在同一个包路径下如果在别的包下需要在 启动类 或 启动类所在包下的存在以上注解的类 中添加 ComponentScan 注解。
例如
启动类
package com.springboottest;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;SpringBootApplication
ComponentScan(basePackages {com.springtest, com.springboottest})
public class SpringbootTestApplication {public static void main(String[] args) {SpringApplication.run(SpringbootTestApplication.class, args);}}Student类与启动类不在同一个包路径下
package com.springtest;import lombok.Data;
import org.springframework.stereotype.Component;import java.lang.reflect.Field;Data
Component
public class Student {private String name;private String nickName;
}2、Component Bean
Component
public class Test {Beanpublic User user() {return new User();}
}注Bean注解的方法返回值 User 作为注入的 Bean 对象。 3、Import(PlaceHolderClass)快速导入一个组件
PlaceHolderClass描述一般Class直接注入实现了ImportSelector接口的Class根据返回类的全限定名数组注入实现了ImportBeanDefinitionRegistrar接口的Class获取类描述信息选择性手动注入
Configuration
Import({ImportDemo.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class ImportConfig{Beanpublic User user(){return new User();}
}//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector {//返回值是导入到容器中的组件全限定名数组Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {//当前类的所有注解SetString annotationTypes importingClassMetadata.getAnnotationTypes();System.out.println(当前配置类的注解信息annotationTypes);return new String[]{com.paopaoedu.springboot.bean.user01,com.paopaoedu.springboot.bean.user02};}
}public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {/*** AnnotationMetadata当前类的注解信息* BeanDefinitionRegistry:BeanDefinition注册类* 把所有需要添加到容器中的bean调用* BeanDefinitionRegistry.registerBeanDefinition手工注册进来*/Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {boolean definition registry.containsBeanDefinition(com.paopaoedu.springboot.bean.User01);boolean definition2 registry.containsBeanDefinition(com.paopaoedu.springboot.bean.User02);if(definition definition2){//创建一个类的BeanDefinitionBean的描述信息对象RootBeanDefinition beanDefinition new RootBeanDefinition(User03.class);//注册一个Bean指定bean名registry.registerBeanDefinition(User03, beanDefinition);}}
}4、使用Spring提供的FactoryBean注入
public class UserFactoryBean implements FactoryBeanUser {// 注入的BeanOverridepublic User getObject() throws Exception {return new User();}// 注入的Bean类型Overridepublic Class? getObjectType() {return User.class;}// 是否是单例Overridepublic boolean isSingleton() {return true;}
}