package cn.xhx.spring.di.annotation.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.xhx.spring.di.annotation.Person;
public class AnnotationTest {
/**
* 原理
* 1、当启动spring容器时,创建两个对象(student,person)
* 2、当spring容器解析到
* <context:annotation-config></context:annotation-config>
* spring容器会在spring容器管理的bean的范围内查找这些类的属性上面是否加了@Resource注解
* 3、spring解析@Resource注解的name属性
* 如果name属性为""
* 说明该注解根本没有写name属性
* spring容器会得到该注解所在的属性的名称和spring容器中的id相匹配,如果匹配成功,则赋值
* 如果匹配不成功,则按照类型进行匹配
* 还不成功,报错!
* 如果name属性不为""
* 则按照name属性的值和spring容器中的id做匹配,如果匹配成功,则赋值,不成功,则报错!
* 说明:
* 注解只能作用于引用类型
* 注解写法比较简单,但是效率比较低
* xml写法比较复杂,但是效率比较高
*/
@Test
public void AnnotationTest () {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person)applicationContext.getBean("person");
person.getStudent().say();//输出"student say"
}
}
package cn.xhx.spring.di.annotation;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.annotation.Resource;
public class Person {
private String name;
@Resource(name="student")
/**
* @Autowired //按照类型进行匹配
* @Qualifier("student") //按照id进行匹配
* @Resource是java扩展包下的,spring为了不使用java的注解,编写了@Autowired和@Qualifier,其2个的作用相加等于@Resource
*/
private Student student;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
}
package cn.xhx.spring.di.annotation;
public class Student{
public void say() {
System.out.println("student say");
}
}
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<bean id="student" class="cn.xhx.spring.di.annotation.Student"></bean>
<bean id="person" class="cn.xhx.spring.di.annotation.Person"></bean>
<context:annotation-config></context:annotation-config>
</beans>