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

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

粗放的贴一下代码:

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);
	@Autowired
	private OperationContext context;

	@Path("QSRental")
	@Produces({ MediaType.TEXT_PLAIN })
	@POST
	public 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 })
	@POST
	public 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
@Transactional
public class CityListInitService {
	private static Logger logger = LoggerFactory
			.getLogger(CityListInitService.class);

	@Autowired
	private 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
@Transactional
public 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  对那些比较中立的类进行注释。




  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值