Spring入门篇(二)

@Required:用于setter方法
@Autowired:用于setter方法 ,成员变量,构造器上
注意:在使用@Service注解注册的bean时,最好如下(使用接口):
service s = applicationContext.getBean(“serviceImpl”);
注意service 和serviceImpl使用
autowired 自动装配注解
可以用在set方法上,亦可以用在成员变量或者构造器;
每个类只能有一个构造器被标记为required=true
在Service中使用DAO对象的时候,加上Autowired注解,不需要在xml中配置,也不需要setter方法

@Autowired注解
A、可以通过添加注解给需要该类型的数组的字段或者方法,以提供 ApplicationContext 中的所有特定类型的 Bean
B、可以用于装配 key 为 string 的 map
C、如果希望数组有序,可以让 Bean 实现 org.springframework.core.Ordered 接口或者使用 @Order 注解
可以使用@Autowaird注解那些众所周知的解析依赖性接口,比如:BeanFactory,ApplicationContext,Environment,ReaourceLoader,ApplicationEventPublisher,and MessagSource
比如可以声明一个ApplicationContext的一个引用,并使用@Autowaird注解,就可以在当前类中得到IOC的上下文信息,并可以使用上下文信息

@Qualifier注解:
按类型自动装配可能有多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围或者指定唯一,也可以用于指定单独的构造器参数或方法参数,也可用于注解集合类型变量;
用法如下:
如果使用bean装配则不需要再Spring XML中配置,直接在bean类中使用 @Qualifier(“beanName”)
如果需要在Spring XML中配置,则在bean标签下添加,然后在bean类中使用@Qualifier(“名称”)
虽然@Resource和@Autowired都可以来完成注入依赖,但它们之间是有区 别的。首先来看一下:
a。@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
b。@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
c。@Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用 @Resource的方式;
基于java的容器注解IOC容器@Bean注解。:
1.@Bean:初始化一个bean并注册到springIoc容器加以管理。
同xxx.xml配置文件中的< bean>,适用于成员方法上,结合@Configuration(类上)使用
2.@Bean注解初始化生成的bean,在不指定名称时,是该注解注解的成员方法的名字 eg:
@Bean
public A getA(){return new A();}//该bean在注册到SpringIoc容器里的名称是getA.
指定名称@Bean(name=”xx”)时,该bean在注册到SpringIoc容器里的名称是xx
3.@Bean(name=”” initMethod=”” destroyMethod=”“),支持init和destroy,同xxx.xml配置文件效果相同。

使用@ImportResource和@Value注解进行资源文件读取
下面的例子是加载资源文件以及读取资源文件的两种方式
方式一:通过配置文件的方式:
< context:property-placeholder location=”” > 作用是加载资源文件
那么读取文件可以通过${key}方式获取配置文件中的值,key表示配置文件中的key
示例中的例子表示将配置文件中jdbc的url,username,password的值分别获取并装配到DriverManagerDataSource类中的url,username,password属性中去。

方式二:通过注解方式获取
将一个用于装载资源文件的类用@Configuration注解该类并通过注解@ImportResource引入配置文件;获取配置文件中的值是通过@Value(”${key}”)的方式获取值,@Value要标注到属性上,才能自动将配置文件的值装配到属性上。
用@Value获取配置文件值的时候要注意,如果配置文件中key为“username”,此时spring会读取登录当前操作系统的用户名,所以此种情况要注意,不要用username做key,尽量用jdbc.username。

@bean @bean(name=”类名”) 默认是单例的;
@scope 指定bean的作用域 值有singleton(默认),prototype(只存活于当前注解范围,每次调用都重新创建),session,request,global session
@Scope(value=”prototype”, proxyMode = ScopedProxyMode.TARGET_CLASS)
可以像在xml中配置bean一样,配置bean的作用范围。

CustomAutowireConfigurer
.CustomAutowireConfigurer是BeanFactoryPostProcessor的子类,通过它可以注册自己的qualifier注解类型(即使没有使用Spring的@Qualifier 注解)
.该AutowireCandidateResolver决定自动装配的候选者:
–每个bean定义autowired-candidate值
–任何< bean/>中的default-autowire-candidates
–@Qualifier注解及使用CustomAutowireConfigurer的自定义类型

基于泛型的自动装配
定义接口的时候可以指定泛型,即.在实现的时候在具体添加泛型里面的类型.

public interface inter
{
}

public class interimp entends inter< string>{
}

可以使用@Autowired自动装配泛型的类型
即:

假设A< T>是一个接口.
public interface A< T>{}

B实现A接口,添加了< String>泛型.
public class B implements A< String>{}

C实现A接口,添加< Integer>泛型.
public class C implements A< Integer>{}

@Configuration
public class Test{

@Autowired
private A< String> a1;

@Autowired
private A< Integer> a2;

@Bean
public B b(){
return new B();
}

@Bean
public C c(){
return new C();
}

}
当通过ApplicationContext加载xml文件后,进行自动扫描,当扫描到@Configuration注解时便进行配置,把@Bean标注的bean注册到IOC容器中.
并且识别到@Autowired注解,把名字为b的bean添加到属性a1中.把名字为c的bean添加到属性a2中.

1.@Resource 没有指定名称name,则是通过下面的属性名或setter方法名得出
2.初始化和销毁之前调用:@PostConstruct , @PreDestroy注解在方法之上;需要先注册CommonAnnotationBeanPostProcessor类
3.@Named和@Inject一起使用: @Named可以放在类上,@Named(“xx”)放在setter方法的形参前,@Inject可以放在变量或setter上
如果想使用特定名称进行依赖注入,那么就用@Name,@Name和@Component是等效的
4.JSR3.0标准注解(依赖注入注解)以来javax.inject包,使用maven引入
ApplicationContext中的CommonAnnotationBeanPostProcessor类

猜你喜欢

转载自blog.csdn.net/weixin_39927996/article/details/81545857