上1篇博客,学习了spring的依赖注入,即利用spring容器来为类中的属性赋值,分为两种赋值方法,利用set和利用构造方法,我们都知道,如果我需要为某1个属性赋值的话,必须为该属性写上set方法,那末大家有无想过1个问题,如果我们1个类中有很多个属性,我们会生成大量的set方法,如果用构造方法来赋值,即<constructor-arg index="" type="" ref="" value=""></constructor-arg>,这样也会存在很多个这样的标签,由于1个<constructor-arg index="" type="" ref="" value=""></constructor-arg>只能为1个属性赋值,为了解决这些困难,我们可以利用注解来为属性进行赋值。
一样,我们新建两个类ClassInfo.java和Teacher.java
注意:由于我们使用注解来为属性赋值的,所以我们需要导入命名空间,以下:
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context⑵.5.xsd"
其次需要导入依赖注入的注解解析器:
<context:annotation-config></context:annotation-config>
3.导入需要被spring容器来管理的类。
经过上面漫步操作以后呢,applicationContext.xml是这个模样:
this is classInfo....
这充分辩明了利用注解为Teacher类中的classInfo对象赋值成功了。在这里需要注意:如果我么你的@Resource的注解的值为"",那末spring将会将容器中id为该属性的类注入给该属性。甚么意思呢??我举个栗子:
我将上面的@Resource的值修改成这样:@Resource(name="test")此时由于name的值不是"",所以spring容器将不会试图匹配与该属性相同的id对应的类,而是将id为test的类注入给该属性,但是,此时并没有id为test的类,所以会抛出以下异常:
No bean named 'test' is defined
此时我将classInfo对应的id改成test,再次运行发现程序是ok的。
其实spring有自己定义的注解的,仔细的程序员可能发现了@Resource是java官方提供的1个注解,其实不是spring的,我们可以将@Resource替换成@Autowired,这个@Autowired是根据类型进行匹配的。那我如果非要依照id来进行匹配怎样办呢?别急,spring为我们提供了1个@Qualifier,我们如果要匹配spring容器中id为classInfo的类,可以这样写:@Qualifier("classInfo"),注意:这里还需要加上@Autowired,以下:
@Autowired
@Qualifier("classInfo")
private ClassInfo classInfo;
大家有无想过,既然spring是用来管理bean的,难道就没有生命周期的管理???是有的。我们为ClassInfo类添加以下初始化和烧毁方法:
classInfo init....
this is classInfo....
classInfo destroy.....
我们发现确切履行了初始化和烧毁的方法,说明利用注解来实现声明周期的管理也是可以的。
但是,注意spring的注解只能用于援用类型。
那我能不能在applicationContext.xml中对bean的声明也不写呢??是可以的,怎样做的,一样分为以下3步:
1.导入命名空间:
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context⑵.5.xsd"
<context:annotation-config></context:annotation-config>
3.启动依赖注入的注解解析器
<context:component-scan base-package="com.test.spring.di"></context:component-scan>
这里是扫描"com.test.spring.di"包和该包下的所有的类。
4.在需要被spring来管理的类上加上@Component的注解
注意:和@Resource比较相似,@Component是默许匹配类名的第1个字母小写的,比如我在Teacher类上加了@Component这个注解,那末可以这样得到该类对象:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/test/spring/di/applicationContext.xml");
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
如果Teacher类上写了这样1个@Component("teacherId"),那末此时就需要通过
Teacher teacher = (Teacher) applicationContext.getBean("teacherId");
才可以得到Teacher对象。这里的@Component是1个比较宽泛的泛型,spring为我们提供了更详细的注解配置:
@Controller 配置控制器的,控制视图的跳转
@Service 配置service的,不是android中的service
@Repository 配置dao的,控制操作数据库的
我们发现这3个注解是对web开发中的MVC编程很好的1个支持。
恩,今天spring注解,就到这里吧,希望大家看了都能理解。
源码下载
上一篇 poj 1988(并查集)
下一篇 vim编辑器替换功能详解