采用@Aspect、@Before、@After、@Around、@Pointcut、这类注解实现的AOP,存在一些局限性
1.只能用在spring容器管理的类上面进行aop,如@Controller、@Service、@Component、@Reprository等。
2.切入点只能在方法级别。
3.只有被代理的外部类的方法才能被拦截,而内部类调用的函数,才不行。
主要原因是其命名用CGlib的AOP的Proxy实现的。
JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式
分类目录归档:Java开发
javaagent模式的AOP方式。
在catalina.bat中,的首行配置如下:
rem 在IDEAJ2016.3.6版本中,调试模式下,会卡死,并无法初始化MVC容器。
rem set JAVA_OPTS="-javaagent:C:\apache-tomcat-8.5.11\aspectjweaver-1.8.2.jar"
rem 在IDEAJ2016.3.6版本中,调试模式下,会卡死,并无法初始化MVC容器。
rem set JAVA_OPTS=-javaagent:"C:\apache-tomcat-8.5.11\aspectjweaver-1.8.2.jar"
rem 以下方式,是目前验证可行的方法。
set JAVA_OPTS=%JAVA_OPTS% -javaagent:"C:\apache-tomcat-8.5.11\aspectjweaver-1.8.2.jar"
可行的如下:
不可行的如下:
springboot的多环境配置
在src/main/resource/application.properties文件中设置如下:
# 多环境配置文件激活属性
spring.profiles.active=prod
与application.properties同级目录下增加以下配置
application-dev.properties
application-prod.properties
application-test.properties
利用Swagger2配置强大的RestfulApi文档
它可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大RESTful API文档。它既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明。另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API。
io.springfox
springfox-swagger2
2.2.2
io.springfox
springfox-swagger-ui
2.2.2
@RestController
@RequestMapping(value="/users") // 通过这里配置使下面的映射都在/users下,可去除
public class UserController {
static Map users = Collections.synchronizedMap(new HashMap());
@ApiOperation(value="获取用户列表", notes="")
@RequestMapping(value={""}, method=RequestMethod.GET)
public List getUserList() {
List r = new ArrayList(users.values());
return r;
}
@ApiOperation(value="创建用户", notes="根据User对象创建用户")
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
@RequestMapping(value="", method=RequestMethod.POST)
public String postUser(@RequestBody User user) {
users.put(user.getId(), user);
return "success";
}
@ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public User getUser(@PathVariable Long id) {
return users.get(id);
}
@ApiOperation(value="更新用户详细信息", notes="根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"),
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
})
@RequestMapping(value="/{id}", method=RequestMethod.PUT)
public String putUser(@PathVariable Long id, @RequestBody User user) {
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return "success";
}
@ApiOperation(value="删除用户", notes="根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public String deleteUser(@PathVariable Long id) {
users.remove(id);
return "success";
}
}
JSON转java类文件
jetbrain的插件版:POJO Generator,是使用jsonchema2pojo包实现的,很方便直接在IDE中使用。
http://www.jsonschema2pojo.org/这个最强大,最实用
http://jsongen.byingtondesign.com/
http://tool.chinaz.com/tools/json2entity.aspx,站长工具。
Spring-data-redis与Redis组件的匹配
http://search.maven.org/#artifactdetails%7Corg.springframework.data%7Cspring-data-redis%7C1.7.10.RELEASE%7Cjar
每个成熟的组件,当它存在依赖时,均有一份完整的Project Object Model (POM)的参照样板,可以快速定位出最佳版本。
http://search.maven.org/#artifactdetails%7Ccom.alibaba%7Cdruid%7C1.0.29%7Cjar
springboot的框架生成器
http://start.spring.io/sts,在线版,功能齐全,可自由选择gradle或maven方式以及配置各种组件。
http://start.spring.io/spring.zip,命令行版,该版本貌似也是联网到线上生成代码并下载到本地的。
http://start.spring.io/需要自行清加依赖,如redis等
压测的Connector配置
转:Tomcat的运行模式
tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态。
1)bio
默认的模式,性能非常低下,没有经过任何优化处理和支持.
2)nio
利用java的异步io护理技术,no blocking IO技术.
想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为
启动后,就可以生效。
3)apr
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.
必须要安装apr和native,直接启动就支持apr。下面的修改纯属多余,仅供大家扩充知识,但仍然需要安装apr和native
如nio修改模式,修改protocol为org.apache.coyote.http11.Http11AprProtocol
Tomcat的四种基于HTTP协议的Connector性能比较
我们姑且把上面四种Connector按照顺序命名为 NIO, HTTP, POOL, NIOP
为了不让其他因素影响测试结果,我们只对一个很简单的jsp页面进行测试,这个页面仅仅是输出一个Hello World。假设地址是 http://tomcat1/test.jsp
我们依次对四种Connector进行测试,测试的客户端在另外一台机器上用ab命令来完成,测试命令为: ab -c 900 -n 2000 http://tomcat1/test.jsp ,最终的测试结果如下表所示(单位:平均每秒处理的请求数):
NIO HTTP POOL NIOP
281 65 208 365
666 66 110 398
692 65 66 263
256 63 94 459
440 67 145 363
由这五组数据不难看出,HTTP的性能是很稳定,但是也是最差的,而这种方式就是Tomcat的默认配置。NIO方式波动很大,但没有低于280 的,NIOP是在NIO的基础上加入线程池,可能是程序处理更复杂了,因此性能不见得比NIO强;而POOL方式则波动很大,测试期间和HTTP方式一样,不时有停滞。
由于linux的内核默认限制了最大打开文件数目是1024,因此此次并发数控制在900。
尽管这一个结果在实际的网站中因为各方面因素导致,可能差别没这么大,例如受限于数据库的性能等等的问题。但对我们在部署网站应用时还是具有参考价值的。
mvc:annotation-driven与context:annotation-config
并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。
后面,我们处理响应ajax请求时,就使用到了对json的支持。
后面,对action写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是
declares support for general annotations such as @Required, @Autowired, @PostConstruct, and so on.
is actually rather pointless. It declares explicit support for annotation-driven MVC controllers (i.e.@RequestMapping, @Controller, etc), even though support for those is the default behaviour.
My advice is to always declare , but don't bother with unless you want JSON support via Jackson.
当我们需要controller返回一个map的json对象时,可以设定
同时设定