前面我们用了document 和Mvc这两个例子,现在我们使用注解来重构一下:
document:
//document类
@Component("document")
public interface Document {
public void read();
public void write();
}
//管理类
@Component("documentManager")
public class DocumentManager {
//利用resource给属性赋值
@Resource(name="wordDocument")
private Document document;
public void read(){
document.read();
}
public void write(){
document.write();
}
}
//excel类:
@Component("excelDocument")
public class ExcelDocument implements Document {
@Override
public void read() {
System.out.println("excelRead");
}
@Override
public void write() {
System.out.println("excelWrite");
}
}
//pdf类:
@Component("pdfDocument")
public class PDFDocument implements Document {
@Override
public void read() {
System.out.println("pdfRead");
}
@Override
public void write() {
System.out.println("pdfWrite");
}
}
//word类:
@Component("wordDocument")
public class WordDocument implements Document {
@Override
public void read() {
System.out.println("wordRead");
}
@Override
public void write() {
System.out.println("wordWrite");
}
}
//配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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">
<!--
注册扫描类
-->
<context:component-scan base-package="cn.ansel.annotation_document"></context:component-scan>
</beans>
//测试类:
public class testAnnotationDocument {
@Test
public void testAnnotationDocument(){
//启动spring容器,
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("cn/ansel/annotation_document/applicationContext-annotation-document.xml");
//得到管理类的对象
DocumentManager documentManager=(DocumentManager) applicationContext.getBean("documentManager");
//调用其中的方法
documentManager.read();
documentManager.write();
}
}
关于具体的思路,我在前面的帖子中说过了,就不做详细说明。
运行结果:
document小结:
从上面的代码还有配置文件中我们可以看到,在类里面没有了getter&setter方法,也没有在配置文件中把类放到spring容器上,包括给属性的赋值,我们也是使用注解,可以看到代码量确实下来了。
重构Mvc例子:
我们的 Mvc例子只是一个超级简易的Mvc例子。
spring的注解为我们更加详细的 提供了关于Mvc的注解,大家可以看spring的帮助文档:
所以,在这里我们可以应用上:@Controller、@Service、@Repository。
下面是代码:
//控制层
@Controller("studentAction")
public class StudentAction {
//调用service层
@Resource(name="studentServiceImpl")
private StudentService service;
public void saveStudent(){
service.saveStudent();
}
}
//逻辑业务层实现层
@Service("studentServiceImpl")
public class StudentServiceImpl implements StudentService {
@Resource(name="studentDAOImpl")
private StudentDAO dao;
@Override
public void saveStudent() {
dao.saveStudent();
}
}
//dao层实现层
@Repository("studentDAOImpl")
public class StudentDAOImpl implements StudentDAO {
@Override
public void saveStudent() {
System.out.println("save student dao");
}
}
//配置文件:
<context:component-scan base-package="cn.ansel.annotation.mvc"></context:component-scan>
测试类:
public class testAnnotationMVC {
@Test
public void testAnnotation_MVC(){
//启动spring容器
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("cn/ansel/annotation/mvc/applicationContext-annotation-MVC.xml");
//得到控制层对象
StudentAction action=(StudentAction) applicationContext.getBean("studentAction");
//操作
action.saveStudent();
}
}
运行结果:
mvc小结:
比起之前一直使用上层调用下层用new对象,然后把类放到spring容器中使用xml配置文件,使用注解的方式确实方便了很多,感觉我们做了很少,但是spring容器为我们完成了很多工作。
总结:
到目前为止,已经学习到了5个注解:
其中为属性赋值的注解为:
@Resource
@Autowired
@Qualifier
把类加载到spring容器的注解为:
@Component(通用形式)
@Controller(控制层/表现层)
@Service(逻辑业务层)
@Repository(持久化层)