Spring

2018-09-08 15:58:55
admin
541
最后编辑:admin 于 2018-09-08 17:45:48
Spring是为了解决应用复杂性而产生的框架,它吸取了 Java EE容器管理的优点,提供了 一个IoC容器来管理Bean,并通过AOP方式来增强Bean的功能,不同的是它并没像Java EE 那样详细规定容器提供的是何种服务和容器里运行的具体组件类型。Spring只提供了两种机制, 控制反转(IoC)和面向切面(AOP),来提供任意的服务和增强Bean的任意特性,使得Spring 本身容易掌握,又可以通过Bean管理来无限扩展功能。

Spring IoC 容器和 AOP

Spring架构同Java EE—样,包含了企业应用需要的各种技术,这会在本书后面讲解Spring Boot应用开发时讲到,Spring本身提供了两个最核心的技术一IoC容器和AOP增强,如下图所示。

Spring

关于IoC和AOP的详细说明如下所述。
IoC Core Container: Spring Container负责管理你的任意对象,并结合你对对象的描述进行 初始化和加强。比如,对于一个用注解@Controller声明的对象,Spring会认为这个对象是个 Web Controller,如果这个对象里的方法有@RequestMapping注解,则会将客户端发起的HTTP 请求转化成Java方法调用。
@Controller
public class HelloworldController {

@RequestMapping("/sayhello.html")

public @ResponseBody String say(String name){

return "hello "+name;
}

上面的例子中,Spring Container在容器中初始化HelloworldController实例后,对于客户端 发起的/sayhello.html请求,会执行say方法,并自动将请求参数按照say方法声明的名称一一对 应上。



Spring 通常提供一些@Controller、@Service、@Component、@Configuration 注解,只 有使用这些注解的类才会引起Spring容器的注意,并根据注解含义来管理和增强对象。


Spring可以管理和增强任意对象,如常见的@Service注解对象,通常用来处理业务逻辑, Spring Container往往会增强这类对象的事务控制能力。
容器管理还可以为被管理的Bean提供其他被管理和被增强的Bean,如一个己经被@Service 注解的UserService类,在HelloworldController类中,使用@Autowired自动注入这个实例:
@Controller
public class HelloworldController {
@Autowired UserService userService;
}

AOP:上面提到的对象增强离不开AOP技术,AOP (Aspect Oriented Programming)指面 向切面编程,通过预编译方式或者运行时刻对目标对象动态地添加功能。AOP分离了企业应用 的业务逻辑和系统级服务,比如事务服务,还有应用系统的审计、安全访问等代码。比如要实 现用户访问控制,可以对每个Controller的方法使用一个自定义的注解Function,用Spring AOP 向Controller每个方法动态地添加用户权限校验功能,类似如下:
0RequestMapping("/sayhello.html") public 0ResponseBody String say(String name){ return "hello "+name;
@RequestMapping("/adduser.html")
@Function("user.add")
public @ResponseBody String addUser(String name){
注解Function是自定义一个注解,接受一个字符串,表示Controller方法对应的业务功能。 用户是否能访问“user.add”功能,将在数据库中配置。
使用AOP对所有的Controller进行增强:
@Configuration @Aspect
public class RoleAccessConfig {
@Around("within(0org.springframework.stereotype.Controller *) && @annotation(function)")
public Object functionAccessCheck(final ProceedingJoinPoint pjp, Function function) throws Throwable {

if(function!=null){
String functionName = function.value();

if(!canAccess(functionName)){
MethodSignature ms = (Methodsignature) pjp.getSignature();

throw new RuntimeException("Can n〇t Access "+ms.getMethod()) ;
}
}
//继续处理原有调用

Object o = pjp.proceed(); return o;
}
protected boolean canAccess(String functionName){
if(functionName.length()==0){
//总是允许访问 return true;
}else{
//取出当前用户对应的所有角色,从数据库中查询角色是否有访问functionName的权限
return false ;

}

这段代码比较复杂,可以按照这个顺序理解:
1.17@Configuration注解成功引起Spring容器的注意;
1.18@Aspect让Spring容器知道,这是一个AOP类;
1.19@Around是AOP的一种具体方式,我们将在下一章详细介绍,这里只需要知道,它 能对目标方法调用前和调用后进行处理;
1.20within(@org.springframework.stereotype.Controller*)可以理解为对所有使用 @Controller
注解的类进行AOP;
1.21@annotation(function)表不另外一个条件,也就是对具有function参数对应的注解方法 进行AOP;
1.22flmctionAccessCheck是实现AOP的具体代码。
关于AOP,不会在这里做过多说明,如果不理解,也没关系,我们将在下一章详细说明。 这里举例只是说明Spring通过AOP来增强Bean的功能特性。


 Spring 的缺点
随着Spring的功能越来越强,在使用Sprmg的时候,门槛也变得高了起来,诸如搭建一个 基于Spring的Web程序却并不简单,需要进行各种配置。Spring中一些过时的技术也经常无意 地被引用到最新项目中。新手面对同一种需求会面临选择困难,比如处理事务是用XML配置 好,还是使用注解@好?这是因为Spring通过多年的发展,本身变得臃肿,过时的 使用方式没有被淘汰固然很好,但会给初学者带来使用上的混乱。同时Spring也集成了越来越 多的第三方技术,如何方便地使用这些第三方技术,各版本之间不会产生冲突也需要一定的实 践。尽管Spring很强大,但它也在犯Java EE的错误,例如有如下缺点:
使用门槛升高,要入门Spring需要较长时间。 对过时技术兼容,导致使用复杂度升高。
1XML配置己经不是流行的系统配置方式。
2集成第三方工具时候,程序员还要考虑工具之间的兼容性。
3系统启动慢,不具备热部署功能,完全依赖虚拟机或者Web服务器的热部署。
庆幸的是,Spring的开发者们及时认识到了这个问题,推出了基于Spring技术的Spring Boot, 解决了 Spring的如上问题,尤其是上手难、技术使用不统一这两个缺点。经过快速发展,Spring Boot也逐渐被开发人员所喜爱,成为搭建系统非常好的开发框架。正如本书一直强调的,Spring Boot能极速开发Web系统,也能容易地架构大的分布式系统。

    • 在线客服
    • 关注微信
    • 联系电话
      • 欢迎咨询
      • 欢迎加入QQ群 303257430
    • 公众号:源宝网络
      • 联系电话及微信号 18902328227