zoukankan      html  css  js  c++  java
  • Spring

    概述

    轻量级控制反转和面向切面的容器框架。

    功能:

    1. 使用基本的JavaBean代替EJB(Enterprise JavaBean)

    优点:

    1. 低侵入性
    2. 高服用性
    3. DI有效降低耦合度
    4. AOP提供了通用任务的集中管理
    5. ORM(对象实体映射)和DAO简化对数据库的访问
    6. 高开放性,并不强制

    核心:

    IoC

    Inversion of Control,控制反转,其另一个名字是依赖注入(Dependency Injection),就是有Ioc容器在运行期间,动态地将某种依赖关系注入到对象之中。

    所以,DI和IoC是从不同角度描述的同一件事情,就是指通过引入IoC容器,利用依赖关系注入的方式,实现对象的解耦。

    粘合剂,将对象之间的耦合交给IoC容器进行,从而达到解耦的目的。

    AOP

    面向切面编程,从动态角度研究。

    功能:将系统级别处理(日志管理、调试管理、事务管理、缓存等等)分离出来,模块化,而不影响业务逻辑。

    专门用于处理系统中分布于各个模块中的交叉关注点的问题。
    AOP 代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。

    AOP使用:

    1. 定义普通业务组件
    2. 定义切入点
    3. 定义增强处理

    代理对象的方法 = 被代理对象的方法 + 增强处理

    AOP关键概念:

    1. 横切性关注点(Cross Cut Concern):一个独立的服务,不与其他业务逻辑耦合。可能遍布在系统的各个角落,也可能遍布在系统的处理流程之中。
    2. 切面(Aspect):一个关注点的模块化,生成对应的类,这个类就叫切面。切面可能会横切多个对象。
    3. 通知(Advice):对横切性关注点的具体实现。通知类型有:before、throw和after等。多数使用拦截器作为通知模型
    4. 连接点(Joi Point):程序执行中的某个特定点,比如某方法调用或处理异常时,也就是Advice在应用程序上执行的点或时机。
    5. 切入点(Point Cut):可以设定具体的方法上是否需要横切性关注点的实现。
    6. 织入(Weave):把切面连接到其他的应用程序类型或者对象上。
    7. 目标对象(Target Object):被一个或多个切面所通知的对象。
    8. AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约。
    9. 引入(Introduction):也被称为内容类型声明。声明额外的方法或者某个类型的字段。

    开发环境搭建

    直接通过IDEA新建一个Spring项目。

    Ioc注入

    1. Spring通过<null/>注入null值
    2. 通过ref="xxBean" 进行bean注入,通过value="xxValue" 进行值注入
    3. 通过<constructor-arg> 注入构造参数值
    4. 通过<property> 注入属性值
    5. 通过<list>注入list数据,通过<array> 注入array数据,通过<map> 注入map数据,通过<set> 注入set数据
    6. 设置lazy-init="true" 进行延迟初始化
    7. bean的作用域有两种,分别是 singletonprototype。singleton是默认的scope,其实现方式是通过注册表方式注册道单例缓存池。设置为prototype则每次向Spring容器请求获取Bean都返回一个全新的Bean。

    基于注解的配置

    开启方式:在spring的config文件的<beans> 下增加

    <context:annotation-config/> 
    <!--设置对指定的包名下的Spring注解生效-->
    <context:component-scan base-package=”com.demo”>
    

    使用:

    注解 描述 应用域
    @Required 进行依赖检查,只判断字段是否使用了setter注入,若无则抛出异常 bean属性的setter方法
    @Autowired 自动装配,默认按类型装配 bean属性的setter方法、非setter方法、构造函数、属性
    @Qualifier 实现类的类名 作为@Autowired的补充,当对应的属性有多个实现时,声明@Qualifier帮助其自动装配
    @Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配 属性(属于JSR-250的注解)
    @Component、@Service、@Controller、@Repository @Component用于说明一个类是Spring容器管理的类,@Service、@Controller、@Repository是@Component的细化,分别代表服务层、控制层和持久层

    Q&A

    如何将配置 SpringApplication 的配置分离到单独的配置类

    一般情况下,我们使用如下方式启动一个 Spring。

    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
           SpringApplication.run(Application.class);
        }
    }
    

    但是,如果要把配置分离呢?


    (1)编写 Spring 配置类,注意要指定组件扫描位置,因为通常配置类的位置跟 Application 类的位置不一致,而默认情况下Spring 只扫描配置类所在包及其子包的组件

    @SpringBootApplication
    @ComponentScan(basePackages = {"com.example"})
    public class SpringConfig {
    }
    

    (2)修改之前的 Application,移除注解,传入 SpringConfig。

    public class Application {
        public static void main(String[] args) {
           SpringApplication.run(SpringConfig.class);
        }
    }
    

    分离后的好处是,可以将配置统一管理,以及更灵活地在启动 Spring,特别是有必须在 Spring 启动前 Ready 的依赖组件。

    参考

    1. springboot快速入门及@SpringBootApplication注解分析
    写在后面:

    1. 子曰:「学而不思则罔,思而不学则殆」。
    2. 站点地图
    2. 本作品作者为 Lshare,采用知识共享署名 4.0 国际许可协议进行许可。
  • 相关阅读:
    Pieczęć(模拟)
    【并查集】关押罪犯
    火车进栈
    独木舟上的旅行
    哈尔滨理工大学第八届程序设计团队赛K题
    [数学、递推]Everything Is Generated In Equal Probability
    [构造]triples I
    2019牛客第三场
    [DP]销售
    [哈夫曼树]猜球球
  • 原文地址:https://www.cnblogs.com/lshare/p/11334418.html
Copyright © 2011-2022 走看看