Spring基础之IOC和AOP系列(1)

Bean的装配方式:

隐式的bean发现机制和自动装配。

 在Java中进行显式配置。

.在XML中进行显式配置。

一:spring会自动发现xml中装配的bean;

组件扫描(componentscanning):Spring会自动发现应用上下文中所创建的bean。

自动装配(autowiring):Spring自动满足bean之间的依赖。

@ComponentScan和@Component和@Configuration

1)@ComponentScan和作用和在xml中配置的<context:component-scanbase-package="org.springframework.test"/>作用是相同的

不过@ComponentScan的默认扫描的是**/*.class路径所以最好设置basePackage属性指定扫描路径,减少加载时间

Spring会把Bean的数据结构存放在beanDefinition中 主要包括BeanName和BeanClass 其中BeanName默认为类名小写,并保存在一个beanDefinitionMap(ConcurrentHashMap)中

2)@Component告知Spring要为这个类创建bean。

需要创建Bean的标签有

1、@controller 控制器(注入服务)

用于标注控制层,相当于struts中的action层

2、@service 服务(注入dao)

用于标注服务层,主要用来进行业务的逻辑处理

3、@repository(实现dao访问)

用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.

4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的

<bean id=""class=""/>)

注意:只有在ComponentScan扫描过的包才会创建这些bean

只有在这个Spring控制反转容器中,调用getBean()方法或者(lazy-init=false)为true时才会自己创建Bean,跟据BeanDefinitionMap来创建Bean之后将Bean保存在BeanCacheMap容器中。之后再把BeanCacheMap包装成BeanWrapper,我们造作的Bean都是BeanWrapper,这样的好处1、保留原来的OOP关系2、我需要对它进行扩展,增强(为了以后AOP打基础)最后进行注解的扫描,存在上面注解的进行自动注入,不存在的不进行注入

@Configuration 表示这个类是一个spring 配置类,一般这里面会定义Bean,会把这个类中bean加载到spring容器中

因为Spring默认的BeanName为类名小写可以用@Configuration给bean设置不同的ID;

Java显式配置:

JavaConfig在java中显示配置主要依赖的标签为@Configuration

上面解释过加有@Configuration表示这个类是一个Spring的配置类

这种配置方式主要通过配置文件进行注入Bean

说白了,就是设置set方法进行Bean的注入。

 3. 在XML中进行显式配置。

<constructor-arg>表示构造器注入,注入方式会根据参数类型,进行注入。

处理自动装配的歧义性:

所谓歧义,就是指两个相似的Bean再注入的过程中,Spring傻傻的分不清该注入那个类,解决方法如下所示,用注解。

第一种(注入具体类)

依赖出入的时候可以注入具体类,而不是接口

第二种(@Primary)

用(@Primary)标示首选的bean

第三种(@Qualifier)

设置首选bean的局限性在于@Primary无法将可选方案的范围限定到唯一一个无歧义性的选项中。它只能标示一个优先的可选方案。当首选 bean的数量超过一个时,我们并没有其他的方法进一步缩小可选范围。

@Qualifier注解是使用限定符的主要方式。它可以与@Autowired和@Inject协同使用,在注入的时候指定想要注入进去的是哪个bean。

5.bean的作用域

Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的。也就是说,不管给定的一个bean被注入到其他bean 多少次,每次所注入的都是同一个实例。

Spring定义了多种作用域,可以基于这些作用域创建bean,包括:

单例(Singleton):在整个应用中,只创建bean的一个实例。

原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。

会话(Session):在Web应用中,为每个会话创建一个bean实例。

请求(Rquest):在Web应用中,为每个请求创建一个bean实例。

猜你喜欢

转载自blog.csdn.net/yiyongjiajun521/article/details/81331926