2017.02.17

1.模糊查询:like关键字,单引号包括模糊匹配表达式,%代表一个或者多个字符。
查询地址带有广州的所有department_code
selet * from zzgjs_department_define where chinese_address like ‘%广州%’
2.对缓存redis做一层层的封装,spring中只注入一个缓存bean.针对不同的业务需求,比如ITS,UM等,再分别写自己的类封装这个唯一的redis bean,加上分别业务的方法,对
外暴露出专门接口。这就是分解-封装的思想。
3.构建程序代码结构,要有分解封装的思想
4.一般来说。我们会将一些配置的信息放在。properties文件中。
然后使用${}将配置文件中的信息读取至spring的配置文件。
首先。我们要先在spring配置文件中。定义一个专门读取properties文件的类,叫PropertyPlaceholderConfigurer。
这个bean要注入的属性石location,用以指定要读取的配置文件路径。
如下:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
<!--要是有多个配置文件,只需在这里继续添加即可 -->
</list>
</property>
</bean>
这里为什么用locations(还有一个location)
是因为。一般来说。我们的项目里面。配置文件可能存在多个。
就算是只有一个。那将来新添加的话。只需在下面再加一个value标签即可。
然后我们就可以在jdbc.properties文件中填写具体的配置信息了。

<!-- 配置C3P0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>${jdbc.driverClassName}</value>
</property>
<property name="jdbcUrl">
<value>${jdbc.url}</value>
</property>
<property name="user">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>

jdbc.properties文件写的信息。

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root

 

 

30.spring mvc流程及常用注解梳理
32.在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求。
31.在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用
@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。
32.@Controller 用于标记在一个类上后,
分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法
才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做
Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式:

  (1)在SpringMVC 的配置文件中定义MyController 的bean 对象。

  (2)在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。
<!--方式一-->
<bean class="com.host.app.web.controller.MyController"/>
<!--方式二-->
< context:component-scan base-package = "com.host.app.web" />//路径写到controller的上一层(扫描包详解见下面浅析)

33.@RequestMapping, value, method;
34.3、@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
1、共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。
2、不同点

(1)@Autowired

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
public class TestServiceImpl {
// 下面两种@Autowired只要使用一种即可
@Autowired
private UserDao userDao; // 用于字段上

@Autowired
public void setUserDao(UserDao userDao) { // 用于属性的方法上
this.userDao = userDao;
}
}
3.@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称
(byName)来装配,可以结合@Qualifier注解一起使用。如下:

public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
4.(2)@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性
解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定
name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

复制代码
public class TestServiceImpl {
// 下面两种@Resource只要使用一种即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上

@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
this.userDao = userDao;
}
}
复制代码
注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

40.5、@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:

 

 

42.redis是可以删除key的值的、。redis也是可以删除值的。如:jedis.del(key);
43.接口类,要以I开头命名
44.3.每一个service都要继承pafa框架的BaseService,每一个controller都要继承Pafa框架的BaseController,每一个dao都要继承pafa框架的BaseDao。
BaseDao是在pafa-biz.jar里,BaseService也在pafa-biz.jar包,BaseController在pafa-web.jar包。
如果你感觉一层直接继承,不方便你项目的运用,还可以再继承一层,添加自己的东西。比如Controller,可以自己定义APPBaseController,其继承BaseController,
APPBaseController类里添加一些本地化功法和变量,比如添加Logger,添加异常处理返回,生成APPResult等。然后项目所有的controller再继承AppBaseController。

45.所有具体controller的父类AppBaseController,controller父类里可以包括的方法有:1.添加logger。2.处理token。3.处理异常返回 4.生成APPResult返回,设置返回响应

46.isDebugEnabled 、isInfoEnabled 为啥要使用
:为什么要加上logger.isInfoEnabled()?原因有两点。

1).直接使用logger.info("User " + userId + " is using app " + appId)来输出log,也能够达到log级别为INFO或在INFO以下时才输出:("User " + userId + " is using
app " + appId),因为logger.info方法内部有判断输出级别的代码。但是在进入logger.info函数之前,("User " + userId + " is using app " + appId) 这个表达式已经通
过运算拼接成了一个字符串;而如果事先使用 if (logger.isInfoEnabled())进行判断,那么当log级别在INFO以上时,就能省去上述的字符串操作,在高并发和复杂log信息拼
接的情况下,使用这种标准的方法输出log能够省去不小的系统开销。另外,如果构造log信息的过程需要大量字符串操作,建议使用StringBuilder来完成字符串拼接。

2).ERROR及其以上级别的log信息是一定会被输出的,所以只有logger.isDebugEnabled和logger.isInfoEnabled方法,而没有logger.isErrorEnabled方法。
50.例如在应用中有一个输出窗口,一些系统状态信息将被输出到这个输出窗口中。因为 Info 的级别是如此之低,所以为了让用户能够看到有效的输出信息,必须将日志级别开
放到 Info 级别。但是 Warn 的级别比 Info 要高,所以用户不得不被迫看到一些 Warn 的信息。


47.1 Log的用途
不管是使用何种编程语言,日志输出几乎无处不再。总结起来,日志大致有以下几种用途:

l 问题追踪:通过日志不仅仅包括我们程序的一些bug,也可以在安装配置时,通过日志可以发现问题。

l 状态监控:通过实时分析日志,可以监控系统的运行状态,做到早发现问题、早处理问题。

l 安全审计:审计主要体现在安全上,通过对日志进行分析,可以发现是否存在非授权的操作。
2.2 日志对性能影响
不管是多么优秀的日志工具,在日志输出时总会对性能产生或多或少的影响,为了将影响降低到最低,有以下几个准则需要遵守:

l 如何创建Logger实例:创建Logger实例有是否static的区别,在log4j的早期版本,一般要求使用static,而在高版本以及后来的slf4j中,该问题已经得到优化,获取(创建
)logger实例的成本已经很低。所以我们要求:对于可以预见的多数情况下单例运行的class,可以不添加static前缀;对于可能是多例居多,尤其是需要频繁创建的class,我
们要求要添加static前缀。

posted @ 2017-02-17 18:30  跨境电商杂货铺  阅读(375)  评论(1编辑  收藏  举报