Spring注⼊bean的常⽤的六种⽅式
⼀.通过注解注⼊的⼀般形式
Bean类
public class TestBean{
}
Configuration类
@Configuration注解去标记了该类,这样标明该类是⼀个Spring的⼀个配置类,在加载配置的时候会去加载他。@Bean的注解,标明这是⼀个注⼊Bean的⽅法,会将下⾯的返回的Bean注⼊IOC。
//创建⼀个class配置⽂件
@Configuration
public class TestConfiguration{
//将⼀个Bean交由Spring进⾏管理
@Bean
public TestBean myBean(){
return new TestBean();
}
}
测试类
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);
TestBean testBean = Bean("testBean",TestBean.class);
System.out.println("testBean = " + testBean);
⼆.通过构造⽅法注⼊Bean
我们在⽣成⼀个Bean实例的时候,可以使⽤Bean的构造⽅法将Bean实现注⼊
Bean类
@Component
public class TestBeanConstructor {
private AnotherBean anotherBeanConstructor;
@Autowired
public TeanBeanConstructor(AnotherBean anotherBeanConstructor){
this.anotherBeanConstructor = anotherBeanConstructor;
}
@Override
public String toString(){
return"TeanBean{" +
"anotherBeanConstructor=" + anotherBeanConstructor +
'}';
}
}
AnotherBean类
@Component(value="Bean的id,默认为类名⼩驼峰")
public class AnotherBean {
}
Configuration类
@Configuration
@ComponentScan("company.annotationbean")
public class TestConfiguration{
}
注解解释
@AutoWired
⾃动装配
若是在这⾥注⼊的时候指定⼀个Bean的id就要使⽤@Qualifier注解。
注释可以在 setter ⽅法中被⽤于⾃动连接 bean,就像 @Autowired 注释,容器,⼀个属性或者任意命名的可能带有多个参数的⽅法。
还有不解的地⽅可以直接百度注解有更详细的解释跟实例spring ioc注解
@Component(默认单例模式)
@Component 被称为元注释,它是@Repository、@Service、@Controller、@Configuration的⽗类,理论上可以使⽤@Component 来注释任何需要Spring⾃动装配的类。但每个注释都有他们⾃⼰的
作⽤,⽤来区分类的作⽤,Spring⽂档上也说明后续版本中可能为
@Repository、@Service、@Controller、@Configuration这些注释添加其他功能,所以建议⼤家还是少使⽤@Component。
  @Repository注解是任何满⾜存储库⾓⾊或构造型(也称为数据访问对象或DAO)的类的标记。该标记的⽤途之⼀是异常的⾃动翻译,如异常翻译中所述。
  @Service注解⼀般使⽤在Service层。
  @Controller注解⼀般使⽤在Controller层的类,@RestController继承了@Controller。
  @Configuration注解⼀般⽤来配置类,⽤来项⽬启动时加载的类。
@ComponentScan("")
@ComponentScan注解⼀般⽤在Spring项⽬的核⼼配置类,或者在Spring Boot项⽬的启动类⾥使⽤。作⽤就是⽤来扫描@Component 及其⼦类注释的类,⽤于Spring容器⾃动装配。@ComponentScan默认是扫描的路径是同级路径及同级路径的⼦⽬录,所以把Spring Boot的启动类放在根⽬录下,@ComponentScan是可以省略不写的。
主要属性:
1. value属性、basePackages属性
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
这两个值的作⽤是⼀样的,是相互别名的关系。内容是填写要扫描的路径,如果是有⼀个路径,可以不⽤写value,有⼏种写法如下:
@ComponentScan("com.zh.service")
@ComponentScan(value ="com.zh.service")
@ComponentScan(value ={"com.zh.dao", "com.zh.service"})
2. includeFilters属性、excludeFilters属性
这两个的作⽤都是过滤器,excludeFilters的作⽤是剔除values属性内的个别不需要加载的类,⽽includeFilters⼀般是和
excludeFilters配合使⽤,就是被excludeFilters剔除的类⾥⾯,还需要其中的⼏个类,就⽤includeFilters再加上。
举个例⼦,假设送了excludeFilters剔除了所有注解是Repository的类,但其中⼀个Stub开头的类,还要⽤到,就可以按下⾯的例⼦这样写。
ComponentScan.Filter[] includeFilters() default {};
ComponentScan.Filter[] excludeFilters() default {};
Filter作为过滤器的基本对象
@Retention(RetentionPolicy.RUNTIME)
@Target({})
public @interface Filter {
FilterType type() default FilterType.ANNOTATION;
@AliasFor("classes")
Class<?>[] value() default {};
@AliasFor("value")
Class<?>[] classes() default {};
String[] pattern() default {};
}
FilterType是过滤器的类型,定义⽅式有⼏种
public enum FilterType {
ANNOTATION,
ASSIGNABLE_TYPE,
ASPECTJ,
REGEX,
CUSTOM;
private FilterType(){
}
}
三.通过set⽅法注⼊Bean
我们可以在⼀个属性的set⽅法中去将Bean实现注⼊
Bean类
@Component
public class TestBeanSet {
private AnotherBean anotherBeanSet;
@Autowired
public void setAnotherBeanSet(AnotherBean anotherBeanSet){
this.anotherBeanSet = anotherBeanSet;
}
@Override
public String toString(){
return"TestBeanSet{" +
"anotherBeanSet=" + anotherBeanSet +
'}';
}
}
Configuration类
@Configuration
@ComponentScan("company.annotationbean")
public class TestConfiguration{
}
Test类
ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class); TestBean testBean = Bean("testBean",TestBean.class);
System.out.println("testBean = " + testBean);
四.通过属性去注⼊Bean
@Component
public class TestBeanProperty {
@Autowired
private AnotherBean anotherBeanProperty;
@Override
public String toString(){
return"TestBeanProperty{" +
"anotherBeanProperty=" + anotherBeanProperty +
'}';
}
}
这⾥可以通过@AutoWired去⾃动装配它。
五.通过List注⼊Bean
TestBeanList类
@Component
public class TestBeanList {
private List<String> stringList;
@Autowired
public void setStringList(List<String> stringList){
this.stringList = stringList;
}
public List<String>getStringList(){
return stringList;
}
}
TestConfiguration类()配置类
@Configuration
@ComponentScan("annoBean.annotationbean")
public class TestConfiguration {
@Bean
public List<String>stringList(){
List<String> stringList = new ArrayList<String>();
stringList.add("List-1");
stringList.add("List-2");
return stringList;
}
}
这⾥我们将TestBeanList进⾏了注⼊,对List中的元素会逐⼀注⼊。
下⾯我们换⼀种注⼊List⽅式
TestConfiguration类
@Bean
//通过该注解设定Bean注⼊的优先级,不⼀定连续数字
@Order(34)
public String string1(){
return"String-1";
}
@Bean
@Order(14)
public String string2(){
return"String-2";
}
注⼊与List中泛型⼀样的类型,会⾃动去匹配类型,及时这⾥没有任何List的感觉,只是String的类型,但他会去通过List的Bean的⽅式去注⼊。
注意:
第⼆种⽅式的优先级⾼于第⼀种,当两个都存在的时候,若要强制去使⽤第⼀种⽅式,则要去指定Bean的id即可。
六.通过Map去注⼊Bean
@Component
public class TestBeanMap {
private Map<String,Integer> integerMap;
public Map<String, Integer>getIntegerMap(){
return integerMap;
}
@Autowired
public void setIntegerMap(Map<String, Integer> integerMap){
this.integerMap = integerMap;
}
}
/
**
*第⼀种注⼊map⽅式
*/
@Bean
public Map<String,Integer>integerMap(){
Map<String,Integer> integerMap = new HashMap<String, Integer>();
integerMap.put("map-1",1);
integerMap.put("map-2",2);
return integerMap;
}
/**
*第⼆种注⼊map⽅式
*/
@Bean
public Integer integer1(){
return1;
}
@Bean
public Integer integer2(){
return2;
}
这⾥跟List⼀样,第⼆种优先级⼤于第⼀种

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。