最近复习了下Spring的@Autoired的注入方式,一些之前没有理清的地方进行了整理。Spring中bean的获取有三种方式getBean()、getType()、getAliases()。下面对三种方式进行了总结
1.getBean(Class cls),getBean(String name)
该两种方法主要是和@Bean一起使用
public class User {
private String name;
private String pass;
/*** setter and getter **/
}
@Configuration //该注释代表一个Spring的配置文件Application.yml,也就是我们所说的Spring容器
public Class AppConfig {
@Bean
public User initUser() {
User user = new User();
user.setPass("pass");
user.setName("name");
return user;
}
}
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new
AnnotationConfigApplicationContext(AppConfig.class);
User user = ctx.getBean(User.class);
System.out.println(user.getUserName());
}
}
使用时是按照类加载到容器中,直接使用User.class
1.1 getBean(String name)
@Bean中还有一个属性name,使用时可以写成@Bean(name = "user")。像上面@Bean并有加入name属性时,默认为当前方法名initUser。程序启动时可以从后台日志中看到加载的bean名称为initUser.。
17:05:00.212 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean '
initUser'
所以在使用时为User user = ctx.getBean("initUser");
2.getType(String name)
该方法在以前一直没有理解是怎么回事,今天使用了@Autoired后才总算搞明白
public interface Animal {
public void use();
}
@Component
public class Cat implements Animal {
public void use() {
System.out.println("猫[" + Cat.class.getSimpleName() + "]看电影");
}
}
@Component
public class Dog implements Animal {
public void use() {
System.out.println("狗[" + Dog.class.getSimpleName() + "]看门");
}
}
public interface Person {
public void service();
public void setAnimal(Animal animal);
}
主要是下面的这个方法
@Component //把BussinessPerson加入Spring容器中
使用@Autowired时把Animal的属性声明为animal
public class BussinessPerson implements Person{
@Autowired
private Animal animal = null;
@Override
public void service() {
this.animal.use();
}
@Override
public void setAnimal(Animal animal) {
System.out.println("延迟依赖注入");
this.animal = animal;
}
}
测试类如下
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new
AnnotationConfigApplicationContext(AppConfig.class);
Person person = ctx.getBean(BussinessPerson.class);
person.service();
}
}
启动时报如下错误:
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bussinessPerson': Unsatisfied dependency expressed through field 'animal'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'bean.Animal' available: expected single matching bean but found 2:
cat,dog
主要意思是说Spring不知道你要使用哪个类(使用了@Component)
那使用@Autowired如何解决这个问题?就是直接把private Animal dog = null;
重新测试的时候看到是使用dog的方法,到这里才明白@Autowired的规则,首先会根据类型找到对应的Bean,如果对应类型的Bean(我这里是dog)不是唯一的,会根据属性名称(dog)和bean名称进行匹配,匹配上了则使用该Bean。所以说@Autowired是会先调用getType方法进行加载,找不到时再调用getBean方法取得加载的Bean,如果还找不到则抛出异常(可以把Cat和Dog中的注释去掉)
3.getAliases()//别名加载先放着还不是很理解
Spring加载Bean时还有两个注解@Primary和@Qualifier。@Primary一般是用在加载Bean的优先级上,比如上面的private Animal dog = null;出现这种情况时修改的不是特别的合适,如果我次要使用的是Cat呢?所以@Primary是解决优先级的
@Component
@Primary
public class Cat implements Animal
这时出现加载Bean时有多个同样类型的,就优先使用该Bean注入,当然如果Dog和Cat都使用了该注解,还是会出现以上的问题。这时使用@Qualifier就可以解决
@Autowired
@Qualifier("dog")
private Animal animal = null;
分享到:
相关推荐
面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:Spring 注解 @After,@Around,@Before 的执行顺序是?.zip 面试官:...
Spring 中 @PathVariable 注解带点的完整参数获取 在 Spring 框架中,@PathVariable 注解是用来将 URL 中的参数传递给控制器方法的。但是,当 URL 中的参数带有点号(.)时,Spring 会自动截断参数,导致无法获取...
Spring中@Async注解执行异步任务的方法 在业务处理中,有些业务使用异步的方式更为合理。这篇文章主要介绍了Spring中@Async注解执行异步任务的方法。@Async注解是Spring提供的一个annotation,可以将方法异步化,...
spring事务管理注解jar,spring-tx-3.2.4.RELEASE.jar,导入项目即可
在Spring框架中,`@Component`注解是核心的组件注解之一,它标志着一个类作为Spring IoC容器中的Bean。这个注解及其派生注解(如`@Service`、`@Repository`和`@Controller`)是Spring依赖注入(Dependency Injection...
在Spring框架中,@Primary和@Qualifier注解是两个非常重要的注解,它们的主要作用是消除bean注入时的歧义,能够让Spring容器知道加载哪个bean。本文将通过示例代码详细介绍这两个注解的原理解析和使用方式。 @...
在 Spring 框架中,@Component、@Repository、@Service、@Controller 是四个常用的注解,它们都是继承自 @Component 注解,用于标注不同的组件或 Bean。下面我们将详细介绍这些注解的区别和使用场景。 @Component ...
在火狐中显示可能会有问题,大家都是程序员,改个参数就好啦 注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before ,...
在现代软件开发中,尤其是Java领域的企业级应用开发中,Spring框架因其灵活、强大的依赖注入(DI)和面向切面编程(AOP)功能而备受推崇。随着Spring框架的不断发展和完善,它为开发者提供了更多便捷的方式来简化...
Spring Boot系列四 Spring @Value 属性注入使用总结一
Spring 框架中,@Resource 注解是一种常用的依赖注入方式,用于将对象注入到应用程序中。但是,在实际开发中,经常会遇到 @Resource 注解的对象为 null 的问题。本文将详细介绍 Spring 中 @Resource 注解解决 null ...
Spring框架是Java开发中广泛使用的轻量级框架,它提供了丰富的功能,其中之一就是对定时任务的支持。`@Scheduled`注解是Spring Framework中用于创建定时任务的重要工具,它允许开发者在不重启应用的情况下,实现定时...
Spring中@Async注解实现异步调用详解 在Spring框架中,@Async注解是实现异步调用的一个重要机制。异步调用是指在程序执行过程中,不需要等待某个方法的执行结果,而是继续执行下一个方法。这种机制可以极大地提高...
Spring 中 @Service 和 @Resource 注解的区别 1 前言 在咱们使用 spring 框架的时候,注解是“不可或缺”的一部分,她帮我们脱离了配置繁琐的 XML 文件的工作,但有一点却需要我们自己去把握,那就是“3何”,即...
浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...
Spring 框架是 Java 开发领域中非常流行的一个轻量级框架,它通过依赖注入(DI)和面向切面编程(AOP)等特性大大简化了 Java 应用程序的开发工作。随着 Spring 框架的发展,其对 Java 注解的支持也越来越完善。从 ...
Spring框架是Java开发中最广泛应用的轻量级框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,极大地简化了企业级应用的开发工作。这份"spring 源码...