1.Maven找包:

spring-webmvc

spring-jdbc

2.Spring的本质是控制反转,依靠依赖注入来实现。以一个servcie对象为例,即是service暴露注入接口(构造,set方法),由spring配置对象注入(设置)给该service对象,这样可以做到Service层专注业务,不需要因为变化改变自身代码,只要在调用(注入)的时候改变对象即可改变service的具体实现,service面向接口编程,由service主动构建对象到被动接收外部注入的对象。同时Spring作为容器会自己构建对象,这些对象可以作为参数来注入

对象由Spring来创建,管理,装配

3.resources目录放beans.xml

<bean id=  class= >

<property name= value=>

bean相当于一个对象,property相当于给对象属性设值,id是对象的唯一标志符,class为类型,name为别名用逗号或者空格,分号分开;scope指定是不是单例

程序里通过ClassPathXmlApplicationContext("beans.xml")获取ApplicationContext

getBean(id)获取bean,类型转换之后即可用。也可以通过.class获取xml里的对象,不用强制类型转换了

4.property标签中,ref指的是spring容器中创建好的对象,value指的是基本数据类型的值

5.现在,要用不同的底层实现,只要设置代码动态读入相应的配置文件即可,代码不用改了

6.默认使用无参构造对象。

要使用有参构造,需要在bean标签下用<constructor-arg>标签,index或者type来制定参数,或者多个constructor-arg标签直接使用name,value,ref赋值

7. 容器只要被创建了,里边的对象就都会被创建了

8.alias标签,通过name设置源id名,alias设置别名

9.import标签,将多个配置文件合并导入为一个,resource属性指定文件名

10.可以看到,spring的标签还是比较少的。下面要学习标签里的属性

11.依赖注入

构造器注入

  construct-arg标签

set方式注入

  bean,ref,idref,list,set,map,props(Properties类),value,null可以用来设置属性的值

  要注入,必须有set方法。非boolean类型的变量,set方法名要是set+属性名

  • 普通值注入,value注入:<property name="a" value="avavlue">
  • bean对象注入,通过ref指向id,ref=“id”
  • 数组注入,property标签下要有<array><value>aaa </value><value>bbb</value></array>,value标签里的值可以没有双引号
  • list注入,<list>标签
  • map注入,<map> <entry key value/></map>
  • set注入,<set> <value></value></set>
  • null注入,property标签下直接加<null/>标签
  • properties注入,<props><prop key=“”>数值</prop></props>,比如数据库配置
  • idref注入,就是注入目标bean的id这个属性

拓展方式注入

  p: c:这样的方式

p和c是命名空间名称,使用需要导入约束

p的意思是property,可以直接注入属性的值,即为<bean p:属性名=value>的形式,p:属性名-ref可以引用其他bean的id

  c是construct的意思,构造器注入,赋值方式和p的一致

引入了xsd之后,这些都会有提示

12.bean的作用域,即bean要构建几个,scope属性指定

singleton:只有一个,默认值(单线程使用)

prototype:get一次有一个(多线程使用)

request:每次request有一个

session:每次session有一个

13.自动装配是spring自动在上下文中给对象注入属性

自动装配要做两件事情,一是组件扫描,二是按照规则装配

  三种装配方式:

    xml里配置

    java代码注解配置

    隐式装配

自动装配又叫autowire,可以设置bean标签里的autowire属性,可以有以下字符串的值

  • byname自动装配:自动在上下文里找和自己属性对应set方法后边的名字(首字母改成小写)一样的bean id。id要唯一
  • bytype自动装配:自动在上下文里找和自己属性类型相同的bean,类型要唯一,不然报错。要被注入的bean没有id也可以。class要唯一

14.使用注解自动装配

有三个自动装配的注解

@Autowired和@Qualifier是Spring的注解

@Resource是J2EE的注解

这三个注解可以放在字段上,也可以放在set方法上,表示相应的对象属性要被spring自动装配。注解放在字段上,就不需要set方法了

支持注解xml里要做两件事

1.xml头部导入约束

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

2.使用<context:annotation-config/>标签

@Autowired注解:表示默认按照类型扫描组件,装配到该属性。required属性表明是否支持该属性为null

@Qualifier注解:指定该value为id的字符串,找这个id来装配。Qualifier注解不能独自存在

@Resource注解:是Java自带的注解,是上边两个的结合体。先按照指定的name属性去查,再按照默认字段名去查,最后按照类型去查

15.注解开发

标签<context:component-scan base-package="com.kuang.pojo"/>指定要扫描的package,这个包下面的注解会生效
@Component注解,指定bean,默认id为类名首字母小写,通过value值来改变
@Value注解给对象的属性或者set方法注入

衍生注解:

Controller:@Controller

Service:@Service

Dao:@Repository

这四个注解功能一样,都是为了把对象注册到spring容器里,只是为了方便区分

@Scope注解:声明对象作用域

注解的缺点,不是自己的类不能使用注解注册到spring容器中

16.不用xml配置

声明一个类,用@Configuration注解配置

这个类里@Bean注解修饰的东西,返回值是bean标签的class属性,函数名称是其id属性

获取注解配置,要用AnnotationConfigApplicationContext类:  ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);

@ComponentScan注解指定扫描包

@Import(com.a.class)注解:引入其他config类

当使用 < context:component-scan/> 后,就可以将 < context:annotation-config/> 移除了,后者被自动忽略

17.所有的类都要注册到注册到beans里边,所有的bean都要通过容器去取,容器里的bean取出来就是一个对象

18.代理模式,将公共代码给代理,方便集中修改,分工明确,各做各的

分为静态代理与动态代理,动态代理动态生成一个类,通过反射代理无数个类或者接口

静态代理写死了类

动态代理jdk原生方法,有两个类要关注

1.InvocationHandler

2.Proxy

代理类继承InvocationHandler,实现其接口invoke在其中调用真正业务方法并在业务方法前后调用自己的公共代码。通过newProxyInstance动态生成被代理的接口对象,客户调用相应接口即可实现代理调用

19.使用spring接口添加aop

比如MethodBeforeAdvice ,MethodAfterAdvic,在其中的接口方法里做自己的操作

xml里配置:

1.导入约束

2.在标签<aop:config>里配置。

  aop:pointcut定义切入点(业务方法),有id属性用于被环绕引用,experssion属性指定那个包哪个类哪个方法什么样的参数什么样的返回值

  aop:advisor定义环绕,属性advice-ref为实现了spring相应接口的bean id,pointcut-ref为要应用到的切入点业务方法引用

20.使用自定义类添加aop

  aop:aspect定义切面,ref属性指向代理bean的id,即相应的代理方法实现类。里面可以有上面的切入点,还有aop:before等标签定义在什么时候切入。aop:before标签的method属性指定方法,pointcut-ref属性指定要切入的点

这个功能简单,没办法获取切入点信息

21.注解实现aop

@Aspect注解定义切面,即代理实现类

@Before定义before类方法,可以通过@Before("excecution(表达式)")这样的办法指定切入点

22.总之,aop要定义切面,即代理方法,指定这些方法在哪些业务类什么位置执行

23.<aop:aspectj-autoproxy>标签表面自动为用注解声明了的切面创建代理,织入切面

proxy-target-class属性指定代理实现模式,jdk还是CGLib实现代理,true为CGLib

24.@Around注解下,方法可以有个ProceedingJoinPoint参数,通过proceed方法执行方法,在这前后即可加入自己的操作

25.aop在不影响我们的业务代码的情况下,实现动态的增强

26. 整合Mybatis

1.导入jar包

  mybatis

  mysql数据库连接需要的驱动包(mysql-connector-java)

  spring

  aop织入(aspectjewaver)

  mybatis-spring(整合包,取代mybatis默认的配置相关)  

  spring-jdbc(spring操作数据库需要的包)

2.编写配置文件

  maven要在pom里设置静态资源过滤,把不在resources文件里,在java文件夹里的xml文件也导入项目进行编译

编写mybatis步骤:

1.pojo类

2.配置文件

3.Dao层Mapper接口

4.Mapper.xml

5.通过sqlSession的getMapper方法获取Mapper接口代理类然后执行里边的相应方法

Mybatis里需要创造的对象,全部要由spring来创建,管理,装配

Mybatis-Spring配置:

在spring XML里要配置SqlSessionFactory和数据映射器(数据源,配置数据库的)

数据源配置:

  可以使用Spring的数据源替换Mybatis的配置,也可以用c3p0,dbcp,druid(看class)

<!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>

SqlSessionFactory配置:

类要用Mybatis-Spring包里的SqlSessionFactoryBean

指定datasource,绑定mybatis包括config xml路径和各个mapper的xml路径

<!--配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--关联Mybatis-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/kuang/dao/*.xml"/>
</bean>

Mybatis原生配置文件里的environments,datasource,transactionmanager配置会被Mybatis-Spring里的SqlSessionFactoryBean替代。

同样的,Mybatis-Spring会用SqlSessionTemplate代替Myatis的SqlSession,由其自动管理SQL Session。这个类也是SqlSession的子类

模板的意思是流程都是固定死的,只是流程里的数据是不确定的,要在调用的时候填入,在流程中使用

所以,在xml里先用以下办法创建SqlSessionTemplate

<!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--利用构造器注入-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

再把这个Bean注入到要访问Dao层的对象(新增接口实现类)里即可,用的时候调用SqlSessionTemplate的getMapper方法

新的SqlSessionTemplate是线程安全的,在各个线程里都可以使用,不需要自己构造了。

SqlSessionTemplate还支持Batch批量操作

第二种整合办法:

使用 SqlSessionDaoSupport

继承这个类,设置其sqlSessionFactory或者sqlSessionTemplate之一即可。

然后通过getSqlSession()获取SqlSessionTemplate

SqlSessionTemplate操作Dao有两种办法,一是通过getMapper获取接口类调用其中方法,一是把包名+方法名传递给selectOne这样的常规操作函数来调用

27.声明式事务

事物把一组操作放一起,要不都成功,要不都失败,确保一致性和完整性

ACID原则:

  原子性

  一致性

  隔离性

  持久性

事务管理分编程式事物和声明式事务

编程的要自己写代码调用Spring的API,比较麻烦

声明的通过AOP配置,自动调用

使用声明式事务步骤

1.导入约束

xmlns:tx="http://www.springframework.org/schema/tx"

http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

2.将jdbc事务管理器注入Spring并配置其数据源,类为Spring为事务管理抽象出来的类DataSourceTransactionManager

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

3.通过tx:advice标签配置管理器,即事物是什么,及其传播性

其中tx:method配置事务管理器里抽象好的几个事物,add,delete之类的都是自己代码定义的

<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--配置哪些方法使用什么样的事务,配置事务的传播特性-->
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="search*" propagation="REQUIRED"/>
<tx:method name="get" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

传播性为多个方法之前怎么处理事物关系,是进入新事物,还是不进入之类的

  • propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
  • propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
  • propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
  • propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
  • propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
  • propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

4.aop配置,在相应方法即切入点添加事物

<!--配置aop织入事务-->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* com.kuang.dao.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

Spring5最新完整教程IDEA版【通俗易懂2019.11月】的更多相关文章

  1. .NET 5.0 RC2 发布,正式版即将在 11 月 .NET Conf 大会上发布

    原文:http://dwz.win/ThX 作者:Richard 翻译:精致码农-王亮 说明:本译文舍弃了少许我实在不知道如何翻译但又不是很重要的语句. 今天(10月13日)我们发布了 .NET 5. ...

  2. Spring cloud微服务安全实战 最新完整教程

    课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...

  3. [svc]linux常用手头命令-md版-2017年11月12日 12:31:56

    相关代码 curl命令-网站如果3次不是200或301则报警 curl -o /dev/null -s -w "%{http_code}" baidu.com -k/--insec ...

  4. IntelliJ IDEA 2019.2.1 破解教程, 最新激活码(激活到2089年8月,亲测有效,持续更新中...)

    当前最新版本 IDEA 2019.2.1 本来笔者这边是有个正版激活码可以使用的,但是,2019.9月3号的时候,一些小伙伴反映这个注册码已经失效了,于是拿着自己的 IDEA, 赶快测试了一下,果不其 ...

  5. java的GUI之SWT框架 配置开发环境(包含但不限于WindowBuilder完整教程,解决Unknown GUI toolkit报错,解决导入SWT包错误)

    官网(资料挺多的,API文档截图以及示例都有):https://www.eclipse.org/swt/ 克隆官方仓库 git clone --depth=1 git://git.eclipse.or ...

  6. Docker安装MySql完整教程、实操

    docker:官网 docker:镜像官网:        镜像官网可以所有应用,选择安装环境:会给出安装命令,例如:docker pull redis 默认拉取最新的版本(指定版本:docker p ...

  7. W3Cschool菜鸟教程离线版下载链接

    请在电脑上打开以下链接进行下载w3cschool 离线版(chm):http://pan.baidu.com/s/1bniwRCV(最新,2014年10月21日更新)w3cschool 离线版(htm ...

  8. Ajax 完整教程。。转载

    Ajax 完整教程 第 1 页 Ajax 简介 Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应 ...

  9. 【阿里云产品公测】阿里云ACE部署通用完整教程及评测

    [阿里云产品公测]阿里云ACE部署通用完整教程及评测 作者:阿里云用户bailimei ACE应该是目前在公测的服务中应用最广泛的一项服务.在公测云引擎ACE前曾使用过新浪SAE,而ACE给我的最初印 ...

随机推荐

  1. robotframework的变量的使用

    本篇用以记录RF的变量的使用 目录 1.简要介绍 2.使用关键字添加变量 3.使用菜单添加变量 1.简要介绍 RF可以通过菜单和关键字来添加变量,可以根据自己的需求来选择添加变量的方式 2.使用关键字 ...

  2. RabbitMQ使用(下)

    RabbitMQ从信息接收者角度可以看做三种模式,一对一,一对多(此一对多并不是发布订阅,而是每条信息只有一个接收者)和发布订阅.其中一对一是简单队列模式,一对多是Worker模式,而发布订阅包括发布 ...

  3. 【Qt开发】如何将内存图像数据封装成QImage V1

    如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放.旋转)操作.如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像 ...

  4. Java——HashMap源码解析

    以下针对JDK 1.8版本中的HashMap进行分析. 概述     哈希表基于Map接口的实现.此实现提供了所有可选的映射操作,并且允许键为null,值也为null.HashMap 除了不支持同步操 ...

  5. 成功安装 Visio 2016 和 Office 2016 的64位版本~~

    .XML是个很  的东西!!! 折腾了一下 Visio 2016_x64 和 Office 2016_x64,功夫不负! 首先,选对配置工具很重要. 之前总是失败是因为在官网下载的配置工具是给2019 ...

  6. centos 7 无网络情况下,解决yum 安装依赖rpm包

    方法一:在一台有网络的机器,用yum下载好所需程序,传到另外一台网络的机器上安装 yum install xtrabackup --downloadonly --downloaddir=/rpmpat ...

  7. BZOJ 4033: [HAOI2015]树上染色题解

    BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...

  8. RocksDB Rate Limiter源码解析

    这次的项目我们重点关注RocksDB中的一个环节:Rate Limiter.其实Rate Limiter的思想在很多其他系统中也很常用. 在RocksDB中,后台会实时运行compaction和flu ...

  9. Spark Streaming整合Flume + Kafka wordCount

    flume配置文件 flume_to_kafka.conf a1.sources = r1 a1.sinks = k1 a1.channels = c1 a1.sources.r1.type = sp ...

  10. install stackless python on ubuntu

    前言 我准备用stackless模拟游戏玩家登陆/注册等行为,测试游戏服务器的性能. 但是在安装stackless的过程中遇到了很多问题,特此记录下来,也分享给需要的朋友. 关于stackless S ...