分类目录归档:Java开发

Spring-aop的局限性

采用@Aspect、@Before、@After、@Around、@Pointcut、这类注解实现的AOP,存在一些局限性
1.只能用在spring容器管理的类上面进行aop,如@Controller、@Service、@Component、@Reprository等。
2.切入点只能在方法级别。
3.只有被代理的外部类的方法才能被拦截,而内部类调用的函数,才不行。
主要原因是其命名用CGlib的AOP的Proxy实现的。
JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式

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等

转: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

是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。
会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。
并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。
后面,我们处理响应ajax请求时,就使用到了对json的支持。
后面,对action写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是这一句注册的这两个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对象时,可以设定
同时设定 标签,设定字符集和json处理类,例如: