您的位置:首页 > 编程语言 > Java开发

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

2016-06-14 14:33 1086 查看
今天被一个徐家汇商城的技术经理坑了一把;翻一下以前的代码,找找问题出在哪里了 ;

粗放的贴一下代码:

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
 对那些比较中立的类进行注释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: