Java——Spring

1. 概述

  • 两大内核:

    • IoC(Inverse Of Control):反转控制
    • AOP(Aspect Oriented Programming):面向切面编程
  • 优势:

    • 方便解耦,简化开发
    • AOP编程的支持
    • 声明式事务的支持
    • 方便程序的测试
    • 方便集成各种优秀的框架
    • 降低JavaEE API的使用难度
    • 源码是经典学习案例
  • 体系结构:


    Spring Framework Runtime

    Core Container:Spring的核心容器组件, 包含了Spring框架最基本的支撑.

    • Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包.
    • Core, 对应spring-core.jar, Spring核心jar包.
    • Context, 对应spring-context.jar, Spring容器上下文对象.
    • SpEL, 对应spring-expression.jar, Spring表达式语言.
  • 耦合及解耦
    程序的耦合即为程序之间的依赖关系,包括类之间的依赖和方法之间的依赖关系。其存在降低了程序的独立性
    解耦:降低程序间的依赖关系,但是并不可能做到无依赖关系。而我们要做到的程度时编译期无依赖关系,运行期间存在依赖(也就是说编译期对象类文件不存在不会产生错误,但在运行期会报错)。

  • 工厂模式:属于创建型模式,为对象的创建提供了一种最佳方式。

2. IoC:

  • 控制反转:将创建对象的控制权交给工厂。包括依赖注入和依赖查找
  • 作用:降低程序的耦合程度(解除代码中的类之间的依赖关系)
    解耦的思路:
    • 通过反射来创建对象而尽量避免使用new
    • 通过配置文件来获取要创建的全限定类名
  • 步骤:
    1. 获取核心容器对象
    2. 根据id获取类对象

spring中基于xml的IOC环境搭建

  • 用于创建对象<bean>
  • 用于注入数据<property>
  • 用于改变作用范围<bean scope="">
  • 和生命周期相关<bean init-method="" destroy-method="">

ApplicationContext(开发时多使用此方法):构建核心容器时,创建对象的方法时立即加载,适合单例模式。(可设置)
BeanFactory:构建核心容器时,创建对象的方法时延迟加载,适合多例模式。属于顶层接口,功能不如ApplicationContext完善。

依赖注入
使用构造函数提供
使用set方法提供
使用注解提供

3. Spring中常用的ioc注解

  • 用于创建对象:
    @Component
    作用:把当前对象放入Spring容器中
    属性:value:id。默认类名首字母改小写
    @Controller:一般用于表现层
    @Service:一般用于业务层
    @Repository:一般用于持久层
    以上三个注解作用与属性与@Component一模一样,其能使我们更加明确三层开发模式

  • 用于注入数据
    @Autowired
    作用:

    • 自动按照类型注入。只要IoC容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
    • 如果 容器中没有任何bean类型和要注入的匹配,则报错。
    • 如果 容器中有多个bean类型和要注入的匹配,继续按照id配对类名查找 没有则报错。

    @Qualifier

    • 作用:按照类注入的基础上再按照名称注入。给成员变量注入时需配合@Autowired使用,给方法注入时可单独使用。
    • 属性:value,用于指定注入bean的id。

    @Resource

    • 作用:直接按照bean的id注入,可独立使用
    • 属性:name,指定bean的id。
      上述三个注解无法注入基本类型和String类型数据,集合类型数据的注入只能通过XML来实现。

    @Value

    • 作用:用于注入基本类型和String类型数据。
    • 属性:value,用于指定数据的值。可使用SpEL表达式
  • 用于改变作用范围
    @Scope
    作用:指定bean的作用范围
    属性:value,指定范围取值。singleton-单例,prototype-多例。(global-session,解决负载均衡时服务器间session共享)

  • 和生命周期相关 (了解)
    单例对象和多例对象不同
    @PostConstruct:设置初始化方法
    @PreDestroy设置销毁方法

使用下述注解可实现通过配置类替换配置文件bean.xml
@Configuration:指定当前类为一个配置类
@ComponentScan
作用:指定spring在创建容器时要扫描的包
属性:value,包
@Bean
作用:把当前方法的返回值作为bean对象存入spring的ioc容器中
属性:name,指定bean的id
@Import
作用:导入其他的配置类
属性:value,指定其他配置文件的字节码
@PropertySource
作用:指定配置文件的名称和路径
属性:value

4. AOP

  • 面向切面编程:通过预编译和运行期动态代理实现程序功能的统一维护的一种技术
  • 作用:将程序中重复的代码进行提取,在需要的时候,使用动态代理的技术,在不修改源码的情况下对已有方法实现增强。

5. 动态代理模式

  • 基于接口的动态代理

  • 基于父类的动态代理

6. 基于AOP的相关注解

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 告知spring在创建容器时要扫描的包,配置所需要的标签不是在beans的约束中,
    而是一个名为context命名空间的约束中 -->
    <context:component-scan base-package="com.handsomexu"></context:component-scan>

    <!-- 使能aop -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

@Aspect:表示切面

通知:
前置通知:@Before
后置通知:@After Returning
异常通知:@After Throwing
最终通知:@After
环绕通知:@Around

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;

@Aspect
public class AroundExample {

  @Around("com.xyz.myapp.CommonPointcuts.businessService()")
  public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
      // start stopwatch
      Object retVal = pjp.proceed();
      // stop stopwatch
      return retVal;
  }

}

在注解配置模式的aop使用中,spring对通知的调用顺序可能会出现错误的bug,建议采用环绕通知来进行动态代理模式的配置

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335