Spring注解可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息,因为这些信息都可以通过 Java 反射机制获取。
以下例子是在JSP+Servlet+JDBC项目上完成的。
1.在dao层使用注解 @Repository
这里需要注意的是注解是在接口的实现类中写,而不是接口。为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能。
package com.gx.dao.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.gx.dao.IBasicsDataDao;
import com.gx.po.User;
//value="basicsDataDao"中的basicsDataDao就是这个接口在spring容
@Repository(value="basicsDataDao")
public class BasicsDataImpl implements IBasicsDataDao {
@Override
public List<User> selectAll() {
// TODO Auto-generated method stub
return null;
}
@Override
public User findById(int id) {
// TODO Auto-generated method stub
return null;
}
@Override
public int update(User t) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int insert(User t) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int deleteById(int id) {
// TODO Auto-generated method stub
return 0;
}
}
2.在service层使用注解@Service:
使用注解后,不再使用new的方式来实例化dao层。注入dao层使用注解@Autowired(它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作),Spring会将dao层的对象注入到userDao变量,这里的变量名称建议和dao层注解的value值保持一致。而注入dao层也可以使用@Resource注解。@Resource和@Autowired注解都是用来实现依赖注入的。只是@Autowried按byType自动注入,而@Resource默认按byName自动注入。
package com.gx.service.impl;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.gx.dao.IBasicsDataDao;
import com.gx.po.User;
import com.gx.service.IBasicsDataService;
@Service(value="basicsDataService")
public class BasicsDataServiceImpl implements IBasicsDataService {
//第一种写法:自动装配
@Autowired
private IBasicsDataDao basicsDataDaoOne;
//第二种写法
@Resource
private IBasicsDataDao basicsDataDaoTwo;
@Override
public List<User> selectAll() {
// TODO Auto-generated method stub
return basicsDataDaoOne.selectAll();
}
}
3.Spring在applicationContext.xml中配置,如下所示:
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- 开启注解 -->
<context:annotation-config />
<!-- 配置扫描路径, 去扫描有注解的包名-->
<context:component-scan base-package="com.gx.dao,com.gx.service,com.gx.aop" />
<!-- 自动为 spring容器中那些配置@Aspect切面的bean创健建代理,放入切面 -->
<aop:aspectj-autoproxy />
</beans>