Spring学习笔记

IOC(Inversion of Control)控制反转 DI(Dependency Injection)依赖注入

反转资源的获取方向,由spring容器创建对象

配置bean的方式

在xml文件中通过bean结点来配置bean
<bean id="hellowWorld" class="com.pxc.hellow">

</bean>
如果没有指定唯一的id会自动以完整类名作为默认值

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
    public static void main(String[] args) {
        //获取容器对象
         ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
         //通过容器对象来获取配置的 javabean
         Person person=(Person)ioc.getBean("person1");
         System.out.println(person);
    }
}

ApplicationContext类的主要实现类

ClassPathXmlApplicationContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从文件系统中加载配置文件
WebApplicationContext:专门为WEB应用而准备的,它允许从相对于web根路径中完成初始化工作

获取bean的三种方式

  1. getBean(String id)(要强转)
  2. getBean(Class)
  3. getBean(String id,Class)

给构造器传递参数

<bean id="dog3" class="com.pxc.Dog>
<constructor-arg value="哈士奇 "></constructor-arg>
</bean>

注入属性的细节

如果注入的值具有特殊的字符要用<![CDATA[]]>但是这种方式只能通过value标签注入

引用其他bean

<property name="car" ref="car1"></property> //引用另外一个bean
可以配置级联属性
<bean id="car1" class="com.pxc.Car></bean>
<bean id="persoon1> class="con.pxc.Person>
<property name="name" value="pxc"></property>
<property name="age" value="20"></property>
<property name="car" ref="car1"></property>
<property name="car.price" value="300000"></property>
</bean>

集合属性

通过<list></list>标签来注入
<map>
<entry key="car1" value-ref="car1"></entry>
</map>

spring2.5后依赖注入可以使用p命名空间来简化操作

<bean id="person1" class="com.pxc.Person" p:name="pxc" p:age="20" p:car-ref="cars"></bean>

自动装配(用的比价少)

byType:按照类型自动装配,这种方式不好的地方是如果在IOC容器中存在两个相同属性的bean会报错
byName:按照bean的id名确保唯一
<bean id="person1" class="com.pxc.Person" p:name="pxc" p:age="20" autowire="byType"></bean>

bean之间的关系

Paste_Image.png
Paste_Image.png

Bean的作用域

Paste_Image.png

Spring EL表达式 用的是#

  • 引用其他的bean
    <bean id="person1" class="com.pxc.Person">
    <properties name="car" value="#{car}"></properties>
    </bean>

  • 调用方法以及引用对象中的属性
    <bean id="person1" class="com.pxc.Person">
    <properties name="name" value="pxc"></properties>
    <properties name="car" value="#{car}"></properties>
    </bean>
    <bean id="person2" class="com.pxc.Person">
    <properties name="car" value="#{person1.name.toUpperCase()}"></properties>
    <properties name="car" value="#{person1.car}"></properties>
    </bean>

  • 进行运算
    <bean id="person1" class="com.pxc.Person">
    <properties name="age" value="10"></properties>
    </bean>
    <bean id="person2" class="com.pxc.Person">
    <properties name="age" value="#{person1.age+10}">
    </bean>

  • 支持正则和三目运算符

bean的生命周期

Paste_Image.png

<bean id="person" class="com.pxc.Person" init-method="a" destroy-method="b">
<properties name="age" value="20"></properties>
</bean>

bean的后置处理器

Paste_Image.png
Paste_Image.png

如果bean没有初始化方法也会执行后置处理器

Bean的配置方式

  1. 通过全类名:也就是反射

  2. 通过工厂方法:
    静态工厂方法:

Paste_Image.png

包含静态工厂方法类
<bean id="dateFormat" class="java.text.DateFormat" factory-method="getDateInstance">
<constructor-arg value="2"></constructor-arg>
</bean>
实例工厂方法:

Paste_Image.png

<bean id="simpleDateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd HH:mm:ss"></constructor-arg>
</bean>
<bean id="date" factory-bean="simpleDateFormat" factory-method="parse">
<constructor-arg value="2017-8-8 12:12:12"></constructor-arg>
</bean>

  1. FactoryBean:
Paste_Image.png

配置一下:
<bean id="person2" class="com.pxc.PersonFactoryBean"></bean>

基于注解方式配置bean

  • @Component(value="pxc1")
    无需指定创建的bean的id值,有默认的命名策略,将类名首字母小写作为默认的id值,如果设置value属性值就是用户指定的id
    然后需要在配置文件中告知spring要扫描哪个包,首先得导入context的命名空间,然后做一下配置
    <context:component-scan base-package="com.pxc"></context:component-scan>

  • @Respository 标识持久层bean组件

  • @Serivice标识业务层

  • @Controller标识控制层

都可以用@Autowired来完成自动装配@Autowired是按照类型进行装配
@Resource是按照名字装配,@Inject和@Autowired一样只不过没有require属性

AOP(切面编程)

  • 如果没有aop,将核心业务和普通业务分离使用代理模式

第一步:

Paste_Image.png

第二步:

Paste_Image.png

第三步:

Paste_Image.png

主方法调用:

![Uploading Paste_Image_235358.png . . .]

AOP的作用简单来说就是在执行方法前,中后干一些事情,比如数据库事务的提交,数据的关闭,只要在项目开发前配置完成,程序员便不用再考虑这些,切面编程有两种方式。

AOP的术语:

Paste_Image.png
  1. 切面(Aspect):横切关注点模块化(抽象),具有相同功能的横切关注点可以抽象成一个切面。(前置日志后后置日志抽象成一个切面)
  2. 横切关注点。业务处理当中,不同业务的分离点
  3. 通知(Advice):切面必须要完成的工作
  4. 目标(Target):被通知的对象(被代理的对象)
  5. 连接点(JoinPoint)Spring允许加入通知的方法,是横切关注点的另一种表现形式
  6. 切点(pointcut):AOP通过切点定为到特定的连接点
  • 基于AspectJ注解
image.png
  1. 写一个切面类,@Aspect标注
  2. 共同业务加入到切面。业务共同的方法
    3.前置通知,后置通知@Before("execption(public int 完整的方法名)")
    后置通知无论执行是否有异常都会执行。
  3. 需要在spring配置文件中开启aop配置
    <aop:aspectj-autoproxy/>
  4. 要加很多@Component注解

切点表达式

*:通配符,所有
..:在方法的参数列表中使用,不限定类型,顺序,个数

Paste_Image.png

在通知方法的内部访问连接点的细节

在通知方法的参数中,加入一个JoinPoint类型的参数
JoinPoint的一些方法:

获取参数列表:jp.getArgs();
获取方法的名称:jp.getSignature().getName();

返回通知

@After注解无论方法返回过程中是否抛出异常都会执行,@AfterReturing必须是返回成功才会执行,加了这个注解后添加一个returning属性可以得到返回值

Paste_Image.png

异常通知 @AfterThrowing

Paste_Image.png

环绕通知(用的少)

Paste_Image.png
Paste_Image.png

切面的优先级

Paste_Image.png

重用切入点

Paste_Image.png
  • 基于XML配置
image.png

spring对JDBC的支持

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

推荐阅读更多精彩内容

  • 一、Spring框架 1.1 Spring框架是什么 Spring是一种容器框架,用于配置各个组件(bean)并且...
    Jane_Static阅读 387评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 专题一(1)Spring Framework Runtime 遇到的问题:1,业务代码都使用接口,按照接口编程,能...
    Hughman阅读 580评论 0 3
  • 每个人的心里都有一亩田,是被你规划成田字格?还是任凭春来暑往的自由式?是栽树?养花?长草?各有各的信仰,各有各的果...
    紫草茵茵阅读 212评论 0 0
  • 天气慢慢转凉,没有太阳可以,但是没你真的不行
    曹玉YR阅读 122评论 0 0