1spring简介
1.4
Spring Boot
一个快速开发的脚手架
基于springBoot可以快速的开发单个微服务
约定大于配置
Spring Cloud
Spring Cloud 是基于SpringBoot开发的。
弊端:
spring配置比较多。
2 IOC
新建一个项目,导入mvc包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
</dependencies>
IOC是一种设计思想,DI(依赖)注入式控制反转的一种实现,在这之前,对象的新建和依赖关系完全由程序自己控制,现在,将对象的新建和依赖关系交给第三方,程序主要实现业务。新建和控制对象的为IOC容器。
2.1helloSpring
applicationContext
通过xml配的方法生成bean对象,通过修改配置文件,实现注入对象的改变,而程序完全不需要改变。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 相当于通过配置 new 了一个叫hello的对象 -->
<bean id="hello" class="com.kuang.pojo.Hello">
<!--属性必须由set方法,否则无法注入值-->
<property name="str" value="helloString"/>
</bean>
</beans>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QjwPa38F-1659369598528)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220316224443854.png)]
测试
//获取spring的上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//我们的对象在spring管理,我们可以直接获取使用
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello.toString());
//通过上下文,获取不同的bean对象
UserService userServiceMysql = (UserService) context.getBean("userServiceMysql");
System.out.println(userServiceMysql.getService());
UserService userServiceOracle = (UserService) context.getBean("userServiceOracle");
System.out.println(userServiceOracle.getService());
2.2IOC创建对象的方式
1.默认使用无参构造方法新建对象,通过set方法注入属性值
2.通过下标创建bean
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg index="0" value="name"/>
<constructor-arg index="1" value="12"/>
</bean>
3.通过属性名称创建bean
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg name="name" value="属性"/>
<constructor-arg name="age" value="13"/>
</bean>
4.通过属性类型,相同类型难处理
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg type="java.lang.String" value="了些"/>
<constructor-arg type="int" value="17"/>
</bean>
混合使用也是可以拿到结果
<bean id="user" class="com.kuang.pojo.User">
<constructor-arg type="java.lang.String" value="了些"/>
<constructor-arg name="age" value="19"/>
</bean>
//在配置文件被加载处理完成后,bean对象就已经生成了,需要的时候自己获取
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//直接获取使用
User user = (User) context.getBean("user");
3spring的配置
3.1别名
在配置文件中添加bean之后,在新建一个bean,这个时候,通过user T,或者userNew都可以获取到相同的bean.
<bean id="userT" class="com.kuang.pojo.UserT"/>
<alias name="userT" alias="userNew"/>
3.2bean的配置
<!-- id:是bean的唯一标识符,相当于对象名
class:bean对象所对应的全限定名,包名+类名
name 相当于别名,可以取多个别名,可以用空格,也可以用逗号 分隔开-->
<bean id="user" class="com.kuang.pojo.User" name="user2 u2 , u3">
<constructor-arg type="java.lang.String" value="了些"/>
<constructor-arg name="age" value="19"/>
</bean>
3.3 import
适用于团队开发,可以将不同人写的配置文件,导入到同一个配置文件中,这样我们只需要显式的读取一个配合文件,这样所有的配置文件内容都可以被读取。
在applicationCotext.xml文件中添加以下导入,这样就可以通过读取 applicationContext.xml的配置文件上下文获取文件1.中的bean。
配置内容相同可以自动覆盖。
<import resource="applicationContext1.xml"/>
4.依赖注入
4.1构造器注入
???构造器无参注入
4.2set方式注入(核心注入方式)
依赖注入:set注入
依赖:bean对象的创建依赖容器
注入:bean对象的属性注入依赖容器
private String name;
private List<Teacher> teacherList;
private Map<String,String> bankCards;
private Set<String> books;
private String gf;
private String[] games;
private Address address;
private Properties properties;
不同类似属性值得bean配置
<bean id="address" class="com.kuang.pojo.Address">
<property name="address" value="地址。。。。"/>
</bean>
<bean id="teacher1" class="com.kuang.pojo.Teacher">
<property name="tName" value="胡老师"/>
</bean>
<bean id="teacher2" class="com.kuang.pojo.Teacher">
<property name="tName" value="章老师"/>
</bean>
<bean id="teacher3" class="com.kuang.pojo.Teacher">
<property name="tName" value="孙老师"/>
</bean>
<bean id="student" class="com.kuang.pojo.Student">
<property name="name" value="胡歌"/>
<property name="address" ref="address"/>
<!--list-->
<property name="games">
<array>
<value>三年获</value>
<value>火速</value>
<value>宿舍</value>
</array>
</property>
<!--map-->
<property name="bankCards">
<map>
<entry key="苏州" value="7888887"/>
<entry key="南京" value="8989889"/>
<entry key="别急" value="7897878"/>
</map>
</property>
<!--set-->
<property name="books">
<set>
<value>三国演绎</value>
<value>水浒传</value>
<value>西游记</value>
</set>
</property>
<!--null-->
<property name="gf">
<null/>
</property>
<property name="properties">
<props>
<prop key="学号">88383</prop>
<prop key="username">胡给</prop>
</props>
</property>
</bean>
4.3拓展方式注入
p命名空间和c命名空间,首先需要在xml文件中添加约束(单独添加就可以使用)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
//p命名空间
xmlns:p="http://www.springframework.org/schema/p"
//c命名空间
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
//可以直接使用,注入属性property
<bean id="teacher" class="com.kuang.pojo.Teacher" p:grade="一年级" p:tName="胡老师"/>
//不可以直接使用,通过构造方法注入
<bean id="teacher2" class="com.kuang.pojo.Teacher" c:grade="二年纪" c:tName="章老师"/>
</bea
测试:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Teacher teacher = context.getBean("teacher", Teacher.class);
System.out.println(teacher.toString());
Teacher teacher2 = context.getBean("teacher2", Teacher.class);
System.out.println(teacher2.toString());
4.4bean的作用域
1单例模式
<!--scope="singleton" 默认就是单例模式,可以不写-->
<bean id="teacher" class="com.kuang.pojo.Teacher" p:grade="一年级" p:tName="胡老师" scope="singleton"/>
2 原型模式
<!--scope="prototype" 每次获取bean都会生成一个新的bean-->
<bean id="teacher2" class="com.kuang.pojo.Teacher" c:grade="二年纪" c:tName="章老师" scope="prototype"/>
3其他 request,session,application,这些只能在web开发中使用。
7注解使用的配置文件
自动装配
注意:
<bean id="cat" class="Bean.Cat"></bean>
//scope 设置bean的作用域,singleton 表示单例模式,只有一个bean
<bean id="dog" class="Bean.Dog" scope="singleton"></bean>
<bean id="dog2" class="Bean.Dog" scope="singleton"></bean>
//byName 仅根据id的name来装配,byType,仅根据类路径来装配,可以么有id
<bean id="people" class="Bean.People" autowire="byName"></bean>
可以通过注解@Autowired,放在属性上来实现自动注解,
//如果Autowired 定义了required属性为false,说明这个对象可以为null,否则不允许
@Autowired(required = false)
//有相同的name
@Qualifier(value="cat2")
private Dog dog;
@Resource(name = "cat")
private Cat cat;
注意:
1.导入注解的约束:context
2.配置注解的支持: context:annotation-config/
<!--配置文件中添加以下内容,-->
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
//扫描以下包com.kuang.pojo
<context:component-scan base-package="com.kuang.pojo"/>
//引用注解必须有
<context:annotation-config/>
</beans>
package com.kuang.pojo;
import org.springframework.stereotype.Component;
@Component //在扫描包的时候,遇到这样的注解,则为bean
public class User {
public void showName(){
System.out.println("我的名字时哈哈");
}
}
8使用注解开发
1.bean
在spring4之后,要使用注解开发,必须保证aop的包已经导入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gyH6LeZ7-1659369598534)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220322114211739.png)]
在使用注解开发,必须添加coentext约束,添加注解支持
<!--配置文件中添加以下内容,-->
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
//扫描以下包com.kuang.pojo
<context:component-scan base-package="com.kuang.pojo"/>
//引用注解必须有
<context:annotation-config/>
</beans>
在扫描包的java类上加上@Component注解,表示这个java类作为一个bean被spring管理,
2.属性的注入
可以在属性上添加,也可以在set方法上添加
添加了
@Component
public class User {
@Value("狂神")
public String name ;
public int age;
public void setName(String name) {
this.name = name;
}
//相当于<property name="age" value = "12"/>
@Value("12")
public void setAge(int age) {
this.age = age;
}
@Autowired :自动装配通过类型,或者名字
如果Autowired不能唯一自动装配,多个类型不同名称的bean,则需要通过@Qualifier(value=“xxx”)配合使用。
@Nullable 标记了这个字段,说明这个字段可以为null
@Resource :类似于@Autowired,这是一个java的注解,不属于spring里面的注解。默认byName,负责不要Type,依然没有则报错。
@Component :注解,放在类上,说明这个类被spring管理,作为bean用。
@Component
public class User {
@Value("名字")
public String name;
public void showName(){
System.out.println("我的名字时哈哈");
}
public String getName() {
return name;
}
}
3.衍生注解
@Component有几个衍生注解,作用都是将修饰的类注册到容器中交给spring管理,安装mvc的架构区分
。Dao @Repository 主要用于和数据库交互
。service @Service 用户修饰业务层
。Controller @Controller 用来修饰控制器层
这四个注解的功能相同,都是将类注册到spring容器中,作为bean使用。
4.自动装配
@Autowired :自动装配通过类型,或者名字
如果Autowired不能唯一自动装配,多个类型不同名称的bean,则需要通过@Qualifier(value="xxx")配合使用。
@Nullable 标记了这个字段,说明这个字段可以为null
@Resource :类似于@Autowired,这是一个java的注解,不属于spring里面的注解。默认byName,负责不要Type,依然没有则报错
5作用域
@Component
@Scope("prototype")//作用域设置
public class User {
@Value("狂神")
public String name ;
public int age;
public void setName(String name) {
this.name = name;
}
//相当于<property name="age" value = "12"/>
@Value("12")
public void setAge(int age) {
this.age = age;
}
}
6小结
xml配置和注解配置
1.xml配置更加万能,适合任何场景
2.注解,不是自己的类无法使用
3.最佳使用组合,xml配置用来管理bean,注解的方式用来添加属性。
9纯java类实现bean
bean对象
@Scope("sigleType")//是否单例模式设置
@Component//这个注解还是表示这个类被spring管理了
public class User {
@Value("胡歌")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
配置类
@Configuration//表示这是一个配置类,类似于beans.xml。同时这个类也是被spring管理了。
@ComponentScan("com.kuang")//扫描包用,
@Import(AppConfig2.class)//如果有多个配置类,可以通过这个方式记载到一个类里面
public class AppConfig {
//注册一个bean,相当于写的bean标签的作用
//这个方法的名字相当于id,
// 返回值相当于class属性
@Bean
public User getUser(){
return new User();
}
}
测试类
public static void main(String[] args) {
//完全用java类实现,获取bean的方式时AnnotationConfig,上下文容器通过配置了的class对象加载
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
User user =(User) context.getBean("getUser");
System.out.println(user.getName());
}
10 代理模式
10.1静态代理
角色分析:
1.抽象角色:一般会使用接口或者抽象类
2.真是角色:被代理角色
3.代理角色:代理真是角色,代理真实角色后会增加一些附属操作
4.客户:访问被代理的对像
代码步骤
1.接口
public interface Rent {
void rent();
}
2.真实角色
public class Host implements Rent{
@Override
public void rent() {
System.out.println("房东出租了房子");
}
}
3.代理角色
public class Proxy implements Rent{
private Host host;
public Host getHost() {
return host;
}
public void setHost(Host host) {
this.host = host;
}
@Override
public void rent() {
seeHost();
hetong();
host.rent();
payFee();
}
private void seeHost(){
System.out.println("中介带着看房");
}
private void hetong(){
System.out.println("中介签合同");
}
private void payFee(){
System.out.println("给中介费和房租");
}
}
4.客户端访问
public class Client {
public static void main(String[] args) {
//房东要租房子
Host host = new Host();
//代理,中介帮忙租房子,同时会有一些附属操作
Proxy proxy = new Proxy();
proxy.setHost(host);
//不需要面对中介,直接出租房子
proxy.rent();
}
}
代理模式的好处:
。真实角色的操作更加存粹,不需要处理公共业务
。公共业务交给代理处理,实现业务分工
。公共业务交给代理处理,方便管理
代理模式确定
。一个真实角色就一个代理角色,代码量翻倍
10.2代理模式实现aop的思想
在原有代码完全实现的情况下,如果需要在原有代码中增加日志功能,这个时候,防止对原有代码产生影响,可以用代理模式,代理类中增加日志功能,原有代码不变。需要日志的调用只要调用代理类就可以。
10.3动态代理
。动态代理类和静态代理类同样使用
。动态代理类是动态生成的,不是我们直接手写的
。动态代理类分为两大类,基于接口的动态代理,基于类的动态代理
. 基于接口------JDK的动态代理
. 基于类的-----cglib
. java字节码实现----javasist
需要了解两个类 Proxy代理,InvocationHandler调用处理程序
动态代理的好处:
。真实角色的操作更加存粹,不需要处理公共业务
。公共业务交给代理处理,实现业务分工
。公共业务交给代理处理,方便管理
。一个动态代理类代理的一个接口,一般对应一类业务
。一个动态代理类可以代理多个类,只要实现了同一个接口
接口:
public interface HostService {
public void addHouse();
public void deleteHouse();
public void selectHouse();
public void updateHouse();
}
实现接口的真实类:
public class Host implements HostService{
@Override
public void addHouse() {
System.out.println("买了套房");
}
@Override
public void deleteHouse() {
System.out.println("卖了套房");
}
@Override
public void selectHouse() {
System.out.println("巡视了房");
}
@Override
public void updateHouse() {
System.out.println("装修了套房");
}
}
实现InvocationHandler接口的处理器:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
//接口
private Object object;
public void setObject(Object object) {
this.object = object;
}
//生成代理类的方法
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),object.getClass().getInterfaces(), this);
}
//反射调用方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object invoke = method.invoke(object,args);
after();
return invoke;
}
private void before(){
System.out.println("方法之前执行,");
}
private void after(){
System.out.println("方法之后执行,后台通知之类");
}
客户端调用生成代理类并调用犯法:
public class Client {
public static void main(String[] args) {
//真实角色
HostService host = new Host();//对象可以是实现接口的不同对象
// 代理角色不存在,一个生成程序
ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
proxyInvocationHandler.setObject(host);
//得到代理类
HostService hostService = (HostService) proxyInvocationHandler.getProxy();
//代理类执行方法
hostService.addHouse();
hostService.deleteHouse();
}
11 AOP
### 11.1 AOP概述
1.aop面向切面编程,作为oop的一个补充,主要解决纵向编程的问题
2.aop将软件分成核心关注点和横切关注点
比如:主要的业务逻辑,就是核心关注点,严重安全性,记录日志,有些事务。。。就是横切关注点
3.可能用到的场景:
权限,缓存,内容传递,错误处理,懒加载,调试,资源池,同步,记录跟踪,优化,校准,持久化。。
11.2AOP在spring中的作用
提供声明式事务;允许用户自定义切面
11.3使用spring 实现AOP
// 使用aop需要导入的包
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
</dependencies>
纵向接口和实现类:
public interface UserService {
public void add();
public void del();
public void upd();
public void sel();
}
public class UserServiceImpl implements UserService{
@Override
public void add() {
System.out.println("新增加了");
}
@Override
public void del() {
System.out.println("删除了");
}
@Override
public void upd() {
System.out.println("修改了");
}
@Override
public void sel() {
System.out.println("查询了");
}
}
横向类实现:
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class Log implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println(o.getClass().getName()+"执行?"+method.getName());
}
}
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;//反射机制
public class AfterLog implements AfterReturningAdvice {
@Override
public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
System.out.println(method.getName()+"返回?"+o);
}
}
配置文件配置bean和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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--注册beans-->
<bean id="userService" class="com.kuang.service.UserServiceImpl" ></bean>
<bean id="log" class="com.kuang.log.Log" ></bean>
<bean id="afterLog" class="com.kuang.log.AfterLog" ></bean>
<!--使用原生spring API接口-->
<!--注册aop-->
<aop:config>
<!--expression表示切入点 execution(表达式 修饰此public 返回值 类名 方法名 参数)-->
<aop:pointcut id="pointcut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
</beans>
测试:
public class MyTest {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//这里必须是接口对象来接收(代理类)
UserService userService=context.getBean("userService", UserService.class);
userService.add();
userService.del();
}
}
11.4自定义类实现AOP 自己写切面
自定义要给方法类,作为切面
public class DiyPointCut {
public void before(){
System.out.println("====方法之前执行=====");
}
public void after(){
System.out.println("====方法之前后执行=====");
}
}
配置AOP切面,两个方法都保留作为比较
<!--注册beans-->
<bean id="userService" class="com.kuang.service.UserServiceImpl" ></bean>
<bean id="log" class="com.kuang.log.Log" ></bean>
<bean id="afterLog" class="com.kuang.log.AfterLog" ></bean>
<!--方式一 使用原生spring API接口-->
<!--注册aop-->
<!--<aop:config>
<!–expression表示切入点 execution(表达式 修饰此public 返回值 类名 方法名 参数)–>
<aop:pointcut id="pointcut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>-->
<!--方式二 使用类来实现-->
//定义切面的bean
<bean id="diy" class="com.kuang.diy.DiyPointCut"></bean>
//配置AOP
<aop:config>
<aop:aspect ref="diy">//切面
<aop:pointcut id="pointCut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
<aop:after method="after" pointcut-ref="pointCut"></aop:after>
<aop:before method="before" pointcut-ref="pointCut"/>
</aop:aspect>
</aop:config>
</beans>
12spring整合mybatis
1.引入约束
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--spring操作数据库需要spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.13</version>
</dependency>
<!-- aspectjweaver 处理事务和AOP所需的包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
<!--spring整合mybatiS需要用到的包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
</dependencies>
<!--静态资源过滤问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2mybatis-spring
在spring整合mybatis的配置文件xml
1.通过spring提供的文档配置数据源
<!--配置数据源,用spring的数据源代替mybatis的数据源配置,可以选择c3p0,dbcp,druid等方式,这里选择
org.springframework.jdbc.datasource,使用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&useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="987cde@"/>
</bean>
2.配置sqlSessionFactory的bean
<!--要和 Spring 一起使用 MyBatis,需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类。
在 MyBatis-Spring 中,可使用 SqlSessionFactoryBean来创建 SqlSessionFactory。 要配置这个工厂 bean,只需要把下面代码放在 Spring 的 XML 配置文件中-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--可以绑定mybatis,减少mybatis配置文件的内容-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/kuang/dao/*.xml"/>
</bean>
3注入sqlSessionTemplate的bean
<!--SqlSessionTemplate 就是我们在mybatis中的sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--么有set方法,只要通过构造器注入参数-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
4.配置接口实现类的bean
<bean id="userMapper" class="com.kuang.dao.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
5.接口的实现
public class UserMapperImpl implements UserMapper{
public SqlSessionTemplate sqlSession;
public void setSqlSession(SqlSessionTemplate sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public User getUser(int userId) {
return sqlSession.getMapper(UserMapper.class).getUser(userId);
}
}
6.测试
public void getUser(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapper userMapper =context.getBean(UserMapper.class);
User user= userMapper.getUser(1);
System.out.println(user.toString());
}