首先看一些常见的Spring注解:
图中的其他注解都是@component的扩展。
这张图是Bean和Spring的关系图:
一旦在代码中使用关于Spring的注解出现在类里,例如我在实现类中用到了@Autowired注解,被注解的这个类是从Spring容器中取出来的,那调用的实现类也需要被Spring容器管理,加上@Component这个注释或者是它的扩展注释(见上文)。Java Bean的原理:
在一般情况下,Spring IOC容器中的一个Bean即对应配置文件中的一个,这种镜像对应关系应该容易理解。其中id为这个Bean的名称,通过容器的getBean("xxx")即可获取对应的Bean,在容器中起到定位查找的作用,是外部程序和Spring IOC容器进行交互的桥梁。class属性指定了Bean对应的实现类。
在普通的类中只要标注@Configuration注解,就可以为spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供了一个Bean的定义信息。
Bean的注入方式:
Bean注入的方式有两种,一种是在XML中配置,此时分别有属性注入、构造函数注入和工厂方法注入;另一种则是使用注解的方式注入@Autowired、@Resource这里不解释前一种。
@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入到@Autowired标注的变量中。如果容器中没有一个和标注变量类型匹配的Bean,Spring容器启动时将报NoSuchBeanDefinitionException的异常。如果希望Spring即使找不到匹配的Bean完成注入也不用抛出异常,那么可以使用@Autowired(required=false)进行标注。一般为true。如果容器中有一个以上匹配的Bean时,则可以通过@Qualifier注解限定Bean的名称。、
还可以标注方法,如果一个方法拥有多个入参,在默认情况下,Spring自动选择匹配入参类型的Bean进行注入。Spring允许对方法入参标注@Qualifier以指定注入Bean的名称。
一般情况下,在Spring容器中大部分的Bean都是单实例的,所以我们一般都无须通过@Repository、@Service等注解的value属性为Bean指定名称,也无须使用@Qualifier按名称进行注入。
@Resource则按名称匹配注入Bean。如果@Resource未指定"car"属性,则也可以根据属性方法得到需要注入的Bean名称。
在一般情况下,Spring IOC容器中的一个Bean即对应配置文件中的一个
在普通的类中只要标注@Configuration注解,就可以为spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供了一个Bean的定义信息。



