spring记错本

1.IOC:控制反转(DI:依赖注入)对控制反转和依赖注入的理解:
image.png
其中原理是利用反射机制调用setXxx方法
2.新建的applicationContext.xml虽然是xml文件,但是是一个bean类型,新建时应按下图选择。
image.png
3.applicationContext.xml中新增加对象的方式(简单对象用value,如果是对象类型,用ref,且值为需要应用的id值):
image.png
4.获得对象的三种方法:
  • 直接new,最麻烦,代码分散,不好管理
  • 用工厂管理,代码相对流畅,易于管理
  • 用ioc容器,是一个超级工厂
5.三种赋值方式:
  • 根据属性的setXxx方法赋值:
    image.png

    注意:在ioc中定义bean的前提,该bean的类必须提供了无参构造

  • 根据构造方法赋值(顺序分别对应构造方法中的属性顺序):
    image.png

    另外,还可以增加参数确定对应属性
    image.png
  • p命名空间赋值
    image.png

    image.png
  • 当属性是对象类型时,需要在属性名后加-ref


    image.png

    注意:value与<value>注入的区别
    image.png
6.对集合类型的属性赋值

注入各种集合数据类型: List Set map properties

set、list、数组 各自都有自己的标签<set> <list> <array>,但是也可以混着用
image.png
7.给对象类型赋null值与“”的区别

给对象类型赋值null :

        <property name="name" >  
                <null/>       #注意 没有<value>
        </property>

赋空值 ""

        <property name="name" >  
                <value></value>  
        </property>
8.自动装配

(只适用于 ref类型 ):
约定优于配置

自动装配:

<bean ... class="org.lanqiao.entity.Course"  autowire="byName|byType|constructor|no" >  

byName本质是byId
byName: 自动寻找:其他bean的id值=该Course类的属性名
byType: 其他bean的类型(class) 是否与 该Course类的ref属性类型一致 (注意,此种方式 必须满足:当前Ioc容器中 只能有一个Bean满足条件 )
constructor: 其他bean的类型(class) 是否与 该Course类的构造方法参数 的类型一致;此种方式的本质就是byType

可以在头文件中 一次性将该ioc容器的所有bean 统一设置成自动装配:

<beans xmlns="http://www.springframework.org/schema/beans"
...
default-autowire="byName">

自动装配虽然可以减少代码量,但是会降低程序的可读性,使用时需要谨慎。

9.使用注解定义bean

通过注解的形式 将bean以及相应的属性值 放入ioc容器

<context:component-scan base-package="org.lanqiao.dao">
</context:component-scan>

Spring在启动的时候,会根据base-package在 该包中扫描所有类,查找这些类是否有注解@Component("studentDao"),如果有,则将该类 加入spring Ioc容器。
@Component细化:
dao层注解:@Repository
service层注解:@Service
控制器层注解:@Controller

10.使用注解实现声明性事务

待学习

11.AOP:面向方面编程

一个普通的类 -> 有特定功能的类
a.继承类 b.实现接口 c.注解 d.配置

public class MyFilter exntends/implements Xx
{

}

类 -> “通知” :实现接口

前置通知实现步骤:

a.jar
aopaliance.jar
aspectjweaver.jar

b.配置
image.png

c.编写
aop:每当之前add()之前 自动执行一个方法log();

addStudent();  业务方法(IStudentService.java中的  addStudent())
before();  自动执行的通知,即aop前置通知

public class Xxx
{
@Test
a(){}
}

如果出现异常:类似java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
则说明缺少jar

后置通知:

a.通知类 ,普通实现接口
b.业务类、业务方法
StudentServiceImpl中的addStudent()
c.配置:
将业务类、通知 纳入springIOC容器
定义切入点(一端)、定义通知类(另一端),通过pointcut-ref将两端连接起来

异常通知:

根据异常通知接口的定义可以发现,异常通知的实现类 必须编写以下方法:
public void afterThrowing([Method, args, target], ThrowableSubclass):

a.public void afterThrowing(Method, args, target, ThrowableSubclass)
b.public void afterThrowing( ThrowableSubclass)
环绕通知: 在目标方法的前后、异常发生时、最终等各个地方都可以 进行的通知,最强大的一个通知;

可以获取目标方法的 全部控制权(目标方法是否执行、执行之前、执行之后、参数、返回值等)

在使用环绕通知时,目标方法的一切信息 都可以通过invocation参数获取到
环绕通知 底层是通过拦截器实现的。

12.基于注解形式的AOP

a.jar
与实现接口的方式相同
b.配置
将业务类、通知纳入springIOC容器
开启注解对AOP的支持<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
业务类addStudent - 通知
c.编写
通知:

@Aspect //声明该类是一个通知
图片.png
注意:通过注解形式 将对象增加到 ioc容器时,需要设置 扫描器

<context:component-scan base-package="org.lanqiao.aop"></context:component-scan>

扫描器 会将 指定的包 中的 @Componet @Service @Respository @Controller修饰的类产生的对象 增加到IOC容器中
@Aspect不需要 加入扫描器,只需要开启即可:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
通过注解形式 实现的aop,如果想获取 目标对象的一些参数,则需要使用一个对象:JointPoint

注解形式的返回值:
a.声明返回值 的参数名:

    @AfterReturning( pointcut= "execution(public * addStudent(..))" ,returning="returningValue" ) 
    public void myAfter(JoinPoint jp,Object returningValue) {//returningValue是返回值,但需要告诉spring
        System.out.println("返回值:"+returningValue );
注解形式实现aop时,通知的方法的参数不能多、少
实现接口形式、注解形式 只捕获声明的特定类型的异常,而其他类型异常不捕获。
13.基于Schema配置实现AOP

类似 与 实现接口的方式

  • 接口方式通知:public class LogAfter implements AfterReturningAdvice
  • Schema方式通知:
    a.编写一个普通类 public class LogAfter {}
    b.将该类 通过配置,转为一个“通知”

如果要获取目标对象信息:
注解、schema:JoinPoint
接口:Method method, Object[] args, Object target

schema形式 和注解形式相似,不同之处: 注解形式 使用了注册@After, schmema形式进行了多余的配置
14.spring开发Web项目

Web项目如何初始化SpringIOC容器 :思路:当服务启动时(tomcat),通过监听器将SpringIOC容器初始化一次(该监听器 spring-web.jar已经提供)
因此用spring开发web项目 至少需要7个jar: spring-java的6个jar + spring-web.jar,

注意:web项目的jar包 是存入到WEB-INF/lib中
web项目启动时 ,会自动加载web.xml,因此需要在web.xml中加载 监听器(ioc容器初始化)。

Web项目启动时,启动实例化Ioc容器:

 <!-- 指定 Ioc容器(applicationContext.xml)的位置-->
  <context-param>
        <!--  监听器的父类ContextLoader中有一个属性contextConfigLocation,该属性值 保存着 容器配置文件applicationContext.xml的位置 -->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
  </context-param>  
  <listener>
    <!-- 配置spring-web.jar提供的监听器,此监听器 可以在服务器启动时 初始化Ioc容器。
        初始化Ioc容器(applicationContext.xml) ,
            1.告诉监听器 此容器的位置:context-param
            2.默认约定的位置   :WEB-INF/applicationContext.xml
     -->
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
15.拆分spring配置文件
  • java项目:
    applicationContext1.xml
    applicationContext2.xml
    applicationContext3.xml

ApplicationContext conext = new ClassPathXmlApplicationContext("applicationContext3.xml") ;

  • Web项目:
    根据什么拆分?
i.三层结构

UI(html/css/jsp 、Servlet) applicationController.xml
Service :applicationService.xml
Dao:applicationDao.xml
公共 数据库:applicationDB.xml

ii.功能结构

学生相关配置 applicationContextStudent.xml <bean id="" class="X...Student">
班级相关配置 applicationContextClass.xml
合并:如何将多个配置文件 加载
(1)

          <context-param>
        <!--  监听器的父类ContextLoader中有一个属性contextConfigLocation,该属性值 保存着 容器配置文件applicationContext.xml的位置 -->
  <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml,
            classpath:applicationContext-Dao.xml,
            classpath:applicationContext-Service.xml,
            classpath:applicationContext-Controller.xml
        </param-value>
  </context-param>

(2)推荐

  <context-param>
        <!--  监听器的父类ContextLoader中有一个属性contextConfigLocation,该属性值 保存着 容器配置文件applicationContext.xml的位置 -->
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml,
            classpath:applicationContext-*.xml
        </param-value>
  </context-param>

(3)只在web.xml中加载主配置文件,

        <param-value>
            classpath:applicationContext.xml
        
        </param-value>

然后在主配置问加中,加载其他配置文件

<import resource="applicationContext-*.xml"/>
16.Spring整合mybatis
思路:
SqlSessionFactory -> SqlSession ->StudentMapper ->CRUD

可以发现 ,MyBatis最终是通过SqlSessionFactory来操作数据库,
Spring整合MyBatis 其实就是 将MyBatis的SqlSessionFactory 交给Spring

SM整合步骤:

1.jar
mybatis-spring.jar spring-tx.jar spring-jdbc.jar spring-expression.jar
spring-context-support.jar spring-core.jar spring-context.jar
spring-beans.jar spring-aop.jar spring-web.jar commons-logging.jar
commons-dbcp.jar ojdbc.jar mybatis.jar log4j.jar commons-pool.jar

2.类-表

3.MyBatis配置文件conf.xml

4.通过mapper.xml将 类、表建立映射关系

之前使用MyBatis: conf.xml ->SqlSessionFacotry

现在整合的时候,需要通过Spring管理SqlSessionFacotry ,因此 产生qlSessionFacotry 所需要的数据库信息 不在放入conf.xml 而需要放入spring配置文件中

配置Spring配置文件(applicationContext.xml)

6.使用Spring-MyBatis整合产物开发程序
目标:通过spring产生mybatis最终操作需要的 动态mapper对象(StudentMapper对象)
Spring产生 动态mapper对象 有3种方法:

a.第一种方式
DAO层实现类 继承 SqlSessionDaoSupport类

     SqlSessionDaoSupport类提供了一个属性 SqlSession

b.第二种方式
就是省略掉 第一种方式的 实现类
直接MyBatis提供的 Mapper实现类:org.mybatis.spring.mapper.MapperFactoryBean
缺点:每个mapper都需要一个配置一次

c.第三种方式

批量配置 实现类
注意:

Autowired+Service+Repository是通过byType自动装配的
Autowired、Qualifier(name)+Service(name)+Reposutory(name)是通过byName自动装配的

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

推荐阅读更多精彩内容

  • 2.1 我们的理念是:让别人为你服务 IoC是随着近年来轻量级容器(Lightweight Container)的...
    好好学习Sun阅读 2,698评论 0 11
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,438评论 1 133
  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 6,925评论 4 21
  • 概述 Spring是什么? Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但是现在已经不止于企...
    琅筑阅读 1,149评论 2 8
  • 敬爱的老师,智慧的班主任,亲爱的学兄们:大家好!我是来非凡广告的王伟,今天是我的日精进行动第62天,给大家分享我今...
    wp伟子阅读 97评论 0 0