spring 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入

来源:互联网 发布:网络第三方代理加盟 编辑:程序博客网 时间:2024/04/28 14:58

今天被一个徐家汇商城的技术经理坑了一把;翻一下以前的代码,找找问题出在哪里了 ;

粗放的贴一下代码:

1.spring配置文件:这句画的意思是扫面以com.sand开头包中的所有有注解的类注入spring。(就是IOC意思,不要再手工的写)

<!-- spring 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --><context:component-scan base-package="com.sand"></context:component-scan>


2.研习一下代码:接口API:@Componet

@Component@Path("/QSRentalAPI")public class QsRentalAPI {private final static Log logger = LogFactory.getLog(QsRentalAPI.class);@Autowiredprivate OperationContext context;@Path("QSRental")@Produces({ MediaType.TEXT_PLAIN })@POSTpublic String qsRental(@Context HttpServletRequest request) {String response = "";try {String json = StrUtil.buildJsonString(request);QSRentalInBean bean = (QSRentalInBean) JSONObject.toBean(JSONObject.fromObject(json), QSRentalInBean.class);context.setAttribute(QSRentalOperation.IN_BEAN, bean);OPCaller.call(QSRentalOperation.ID, context);response = (String) context.getAttribute(QSRentalOperation.OUT_STRING);} catch (Exception e) {e.printStackTrace();if (e.getMessage().equals(MAGConstant.C_CHECK_SIGN_FAIL)) {return QSRentalOutBean.jsonCommonReturn(MAGConstant.C_CHECK_SIGN_FAIL,MAGConstant.M_CHECK_SIGN_FAIL);}if (e.getMessage().equals(MAGConstant.C_SYSTEM_EXCEPTION)) {return QSRentalOutBean.jsonCommonReturn(MAGConstant.C_SYSTEM_EXCEPTION,MAGConstant.M_SYSTEM_EXCEPTION);}return QSRentalOutBean.jsonCommonReturn(MAGConstant.C_FAIL,MAGConstant.M_FAIL);}logger.info("返回数据  : " + response);return response;}@Path("QSRentalSendResult")@Produces({ MediaType.TEXT_PLAIN })@POSTpublic String qsRentalSendResult(@Context HttpServletRequest request) {String response = "";try {QSRentaResultInBean bean = new QSRentaResultInBean(request);context.setAttribute(QSRentalResultOperation.IN_BEAN, bean);OPCaller.call(QSRentalResultOperation.ID, context);response = (String) context.getAttribute(QSRentalResultOperation.OUT_STRING);} catch (Exception e) {e.printStackTrace();if (e.getMessage().equals(MAGConstant.C_SYSTEM_EXCEPTION)) {return QSRentalOutBean.jsonCommonReturn(MAGConstant.C_SYSTEM_EXCEPTION,MAGConstant.M_SYSTEM_EXCEPTION);}return QSRentalOutBean.jsonCommonReturn(MAGConstant.C_FAIL,MAGConstant.M_FAIL);}logger.info("返回数据  : " + response);return response;}}

2.Service层:@Service @Transaction 

@Service@Transactionalpublic class CityListInitService {private static Logger logger = LoggerFactory.getLogger(CityListInitService.class);@Autowiredprivate CommonDAO dao;public String cityListInitLogic(CityListInitInBean bean) throws Exception {List<ConfigSystem> listConfigSys = dao.getConfigSysList(MAGConstant.CITY_UPDATE);ConfigSystem cs = listConfigSys.get(0);String sysTime = cs.getPa();// 时间int key = Integer.parseInt(bean.getInstallStatus());switch (key) {case 0:// 首次安装logger.info("app 首次安装 ,需要更新数据");return cityList(bean, sysTime);default:// 非首次安装if (DataFormat.sort(sysTime, bean.getTime()) == true) {// 系统更新时间之后的时间,logger.info("app 非首次安装 ,不需更新。更新时间大于系统更新时间  不需要更新");return CityListInitOutBean.notNeedUpdate(sysTime);} else {logger.info("app 非首次安装 。更新时间小于系统更新时间  需要更新");return cityList(bean, sysTime);}}}}

3:标记事务:

@Transactional(propagation = Propagation.REQUIRED)  private String cityList(CityListInitInBean bean, String sysTime)throws Exception {List<CityListInitBean> list = getCityList(bean);return CityListInitOutBean.needUpdate(list, sysTime);}

4:很多知识点啊 :

@Repository@Transactionalpublic class CommonDAO extends HibernateBaseDao<Object, Long> {public List<QSRentalOrder> queryByHQLPage(String hql, int pagesize,int pageNum) {Query query = this.createQuery(hql);query.setFirstResult(pageNum);query.setMaxResults(pagesize);@SuppressWarnings("unchecked")List<QSRentalOrder> list = query.list(); // 得到每页的数据return list;}}

问题就是出在:就是会忘得很快


拓展起来:

<context:component-scan/> 还允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式,通过下表说明:


表 1. 扫描过滤方式
过滤器类型说明注释假如 com.sand.SomeAnnotation 是一个注释类,我们可以将使用该注释的类过滤出来。类名指定通过全限定类名进行过滤,如您可以指定将 com.sand.Boss 纳入扫描,而将 com.sand.Car 排除在外。正则表达式通过正则表达式定义过滤的类,如下所示: com\.sand\.Default.*AspectJ 表达式通过 AspectJ 表达式定义过滤的类,如下所示: com. sand..*Service+

举个例子:

<context:component-scan base-package="com.sand"> <context:include-filter type="regex"   expression="com\.sand\.service\..*"/>     <context:exclude-filter type="aspectj"  expression="com.sand.util..*"/></context:component-scan>

如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。




0 0
原创粉丝点击