spring总结1
@Configuration注解:在类上添加@Configuration注解表明这个类是一个配置类。
装配bean
一、自动化装配bean
1、组件扫描
@ComponentScan注解:在配置类上添加@ComponentScan注解,就能够在Spring中启用组件扫描,查找带有@Component注解的类。这样会在Spring中自动为带有@Component注解的类创建一个bean。默认扫描配置类所在包,也可以自定义,如@ComponentScan(basePackages="soundsystem")、@ComponentScan(basePackages={"soundsystem","video"})、@ComponentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class})为basePackageClasses属性所设置的数组中包含了类,
这些类所在的包将会作为组件扫描的基础包。
@Component注解:在类上使用@Component注解表明该类会作为组件类,并告知Spring要为这个类创建bean。Spring应用上下文中所有bean都会给定一个id,默认是类名第一个字母变小写。也可以自定义,如@Component(“lonelyHeartsClub”)
@Named 注解:@Named作为@Component注解的替代方案。 两者之间有一些细微的差异, 但是在大多数场景中, 它们是可以互相替换的。
2、自动装配
@Autowired注解:@Autowired注解不仅能够用在构造器上,还能用在属性的Setter方法上。 比如说, 如果CDPlayer有一个setCompactDisc()方法, 那么可以采用如下的注解形式进行自动装配 :
private CompactDisc cd; //用在构造器上 @Autowired public CDPlayer(CompactDisc cd){ this.cd = cd; } //用在setter方法上 @Autowired public void setCompactDisc(CompactDisc cd){ this.cd = cd; }
@Autowired(required=false):如果没有匹配的bean, 那么在应用上下文创建的时候, Spring会抛出一个异常。 为了避免异常的出现, 你可以将@Autowired的required属性设置为false ,将required属性设置为false时, Spring会尝试执行自动装配, 但是如果没有匹配的bean的话, Spring将会让这个bean处于未装配的状态。但是, 把required属性设置为false时, 你需要谨慎对待。 如果在你的代码中没有进行null检查的话, 这个处于未装配状态的属性有可能会出现NullPointerException。 如果有多个bean都能满足依赖关系的话, Spring将会抛出一个异常, 表明没有明确指定要选择哪个bean进行自动装配。 就会产生歧义性。
二、通过Java代码装配bean
@Bean注解 (需要在配置类中进行装配)@Bean注解会告诉Spring这个方法将会返回一个对象, 该对象要注册为Spring应用上下文中的bean。 方法体中包含了最终产生bean实例的逻辑。默认情况下, bean的ID与带有@Bean注解的方法名是一样的。 如果你想为其设置成一个不同的名字的话, 那么可以重命名该方法, 也可以通过name属性指定一个不同的名字:
@Bean(name="lonelyHeartsClubBand") public CompactDisc sgtPeppers(){ return new SgtPeppers(); }
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); } //通过这种方式引用其他的bean通常是最佳的选择, 因为它不会要求将CompactDisc声明到同一个配置类之中。 在这里甚至没有要求CompactDisc必须要在JavaConfig中声明, 实际上它可以通过组件扫描功能自动发现或者通过XML来进行配置。 你可以将配置分散到多个配置类、 XML文件以及自动扫描和装配bean之中, 只要功能完整健全即可。 不管CompactDisc是采用什么方式创建出来的, Spring都会将其传入到配置方法中, 并用来创建CDPlayer bean。
三、通过xml装配bean
<bean id="compactDisc" class="soundsystem.SgtPeppers" />当Spring发现这个<bean>元素时, 它将会调用SgtPeppers的默认构造器来创建bean。
四、bean的作用域:
在默认情况下, Spring应用上下文中所有bean都是作为以单例( singleton) 的形式创建的。 也就是说, 不管给定的一个bean被注入到其他bean多少次, 每次所注入的都是同一个实例。
单例(Singleton):在整个应用中,只创建bean的一个实例
原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例
会话(Session):在web应用中,为每个会话创建一个bean实例
请求(Request):在web应用中,为每个请求创建一个bean实例
@Scope注解:如果你想在Java配置中将bean声明为原型bean,那么可以组合使用@Scope和@Bean来指定所需的作用域@Scope(“prototype”)或者@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

浙公网安备 33010602011771号