配置注解生效
<context:annotation-config/>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="hi" class="shuai.spring.study.Hi"/>
<!-- setter注入 -->
<bean id="hello" class="shuai.spring.study.HelloImpl6">
<property name="hi" ref="hi"/>
</bean>
<!-- 构造器注入 -->
<!-- <bean id="hello1" class="shuai.spring.study.HelloImpl6">
<constructor-arg index="0" ref="hi"/>
</bean> -->
</beans>
测试方法
package shuai.spring.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import shuai.spring.study.HelloApi;
public class HelloTest {
@Test
public void testHelloWorld() {
@SuppressWarnings("resource")
ApplicationContext context = new ClassPathXmlApplicationContext("HelloWorld.xml");
HelloApi helloApi = context.getBean("hello", HelloApi.class);
helloApi.sayHello();
}
}
spring自带注解
@Required,应该只是一种检查
正常依赖注入可以根据构造方法注入或者setter注入
但是如果在setter方法加入@Required那就只能setter注入了,这时如果构造器注入打开,加载xml文件的时候就会报错。
package shuai.spring.study;
import org.springframework.beans.factory.annotation.Required;
public class HelloImpl6 implements HelloApi {
private Hi hi;
public HelloImpl6() {
}
public HelloImpl6(Hi hi) {
this.hi = hi;
}
public Hi getHi() {
return hi;
}
@Required
public void setHi(Hi hi) {
this.hi = hi;
}
@Override
public void sayHello() {
hi.saHi();
}
}
@Autowired,自动装配,可以在属性,构造方法,setter方法上面加注解,普通方法也可以,只要有参数就行,方法体能为属性赋值就就行。xml只要写好bean就可以了,不用给属性注入值。
个人理解:@Autowired相当与把方法参数注入值,并且执行有注解的方法。
如果没有可用资源会报错,@Autowired(required = false)
如果有多个资源不知道选哪个,可以在参数前加@Qualifier("名称"),默认是根据类型注入,加了@Qualifier则变为根据名称注入
package shuai.spring.study;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class HelloImpl6 implements HelloApi {
private Hi hi;
public HelloImpl6() {
}
public HelloImpl6(Hi hi) {
this.hi = hi;
}
public Hi getHi() {
return hi;
}
public void setHi(Hi hi) {
this.hi = hi;
}
@Autowired(required = false)
public void test(@Qualifier("hi") Hi hi) {
System.out.println(hi);
this.hi = hi;
}
@Override
public void sayHello() {
hi.saHi();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id="hi" class="shuai.spring.study.Hi"/>
<bean id="hi1" class="shuai.spring.study.Hi"/>
<!-- setter注入 -->
<bean id="hello" class="shuai.spring.study.HelloImpl6">
<!-- <property name="hi" ref="hi"/> -->
</bean>
<!-- 构造器注入 -->
<!-- <bean id="hello1" class="shuai.spring.study.HelloImpl6">
<constructor-arg index="0" ref="hi"/>
</bean> -->
</beans>
还是上面的测试
输出结果:
shuai.spring.study.Hi@4b9e255
hi
也可以这样
<bean id="hi1" class="shuai.spring.study.Hi">
<qualifier value="hi2"/>
</bean>
这样hi1将失效,
如果这样
<bean id="hi1" class="shuai.spring.study.Hi">
<qualifier value="hi2"/>
<qualifier value="hi3"/>
</bean>
hi1、hi2都失效,hi3有效
JSR-250注解
@Resource:自动装配,默认根据类型装配,如果指定name属性将根据名字装配,和@Autowired不同的是可以指定name来根据名字注入。
其它的看开涛老师的:http://jinnianshilongnian.iteye.com/blog/1457224