面试突击spring,看这一篇就够了,给你总结的清新脱俗!
Spring及IOC介绍
Spring简介
Rod Johnson,Spring Framework创始人,著名作者。很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
Spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!
SSH:Struct2 + Spring + Hibernate!
SSM:SpringMVC + Spring + Mybatis!
依赖导入:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.5</version> </dependency>
总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架
缺点:“配置繁琐,配置地狱” 所以SpringBoot就出来了
IOC:以前程序主动权在程序员手中,用户需求得通过程序员修改,IOC就是改变这种手段,将控制权交到用户手中:控制反转。大大解除了程序的耦合性,这样程序员就可以更加专注于业务层开发
IOC创建及重点配置
新建Maven项目,导入依赖,编写实体类
@Data public class Student { private String name; private int id;
编写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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 实体类映射--> <!-- 默认使用无参构造函数创建对象,--> <!-- 若要使用有参,需要用<constructor-arg--> <bean id="student" class="com.song.pojo.Student"> <constructor-arg name="name" value="mike"/> <constructor-arg name="id" value="2"/> <property name="name" value="hehe"/> </bean> <!-- <bean id="..." class="...">--> </beans>
测试
public class myTest { @Test public void test(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Student student = (Student) applicationContext.getBean("student"); System.out.println(student.toString()); } }
思考:对象是如何创建的?
Spring自动创建对象,由Spring容器给对象属性赋值
这个过程就称为控制反转
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。
反转:程序本身不创建对象,变成被动的接受Spring容器创建的对象
容器通过set方法进行属性值的注入
对象由Spring来创建,管理,装配!
Spring重点配置!
<!-- id:bean的唯一标识符,也就是相当于我们学的对象名 class:bean对象所对应的全限定名:包名+类名 name:也是别名,而且name可以同时取多个别名 --> <bean id="userT" class="com.kuang.pojo.UserT" name="user2 u2,u3;u4"> <property name="name" value="吴亦凡"/> </bean> <import resource=baen.xml/>
依赖注入以及自动装Bean
当实体类出现复杂属性时如下:
@Data public class Person { private String name;//名字 private Cat cat;//宠物 private String[] books;//书籍 private List<String> hobbies;//爱好 private Map<String,String> card;//卡 private Set<String> games;//游戏 private String wife;//妻子 private Properties info;//配置信息 private Dog dog; }
引用注入 cat
<!-- 引用 ref--> <property name="cat" ref="cat"/> <bean id="cat" class="com.pojo.Cat"/>
数组 books
<!-- 数组 arry--> <property name="books"> <array> <value>java核心技术</value> <value>jvm入门</value> <value>数据库入门到入土</value> <value>西游记</value> </array> </property>
list、set集合 hobbies games
<!-- list集合 List--> <property name="hobbies"> <list> <value>唱</value> <value>跳</value> <value>rap</value> </list> </property>
set时换一下关键字即可
map集合 card
<!-- Map集合 map--> <property name="card"> <map> <entry key="身份证" value="5206565656565"/> <entry key="银行卡" value="111111111111111"/> </map> </property>
null wife
<!-- null--> <property name="wife"> <null/> </property>
properties info
<property name="info"> <props> <prop key="url">https//www.baidu.com</prop> <prop key="driver">https//www.baidu.com</prop> </props> </property>
自动装配Bean
缘由:当一个实体类中有其他类的引用属性时我们通常在xml中采用ref的方式指向另一个Bean,这种方式很繁琐,如下:
<bean id="student" class="com.song.Student"> <property name="name" value="mike"/> <property name="sex" value="男"/> <property name="dog" ref="dog"/> <property name="cat" ref="cat"/> </bean> <bean id="dog" class="com.song.Dog"/> <bean id="cat" class="com.song.Cat"/>
而自动装配有主要两种方式:xml中autowire自动装配和注解自动装配
xml
在bean标签中加入autowire标签即可
小结:
ByName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!
ByType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!
使用注解实现自动装配
特别简单 导入注解约束——》配置注解的支持——》使用@Autowire注解
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" xmlns:context="http://www.springframework.org/schema/context" 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" >
使用注解
@Value("吴亦凡") private String name; private String sex; @Autowired private Dog dog; @Autowired private Cat cat;
使用@Resource(java内置),用法和上面一样,
区别:@Autowired优先byType,@Resource优先byName然后byType
使用注解开发(improtant)
1、导入AOP包和约束
aop包在导入Springwebmvc时候就一起导入进来了
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd" > //扫描包下的注解 <context:component-scan base-package="com.song"/> <context:annotation-config/> </beans>
AOP
Aop:Aspect Oriented Programming的缩写,意思是面向切面编程,动态的在程序运行期间找个切点将一段程序执行插入进去,实现了在不改动源程序的基础下增加功能;
优点:有了 AOP,我们可以定义交叉的关系,并将这些关系应用于跨模块的、彼此不同的对象模型。AOP 同时还可以让我们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护。它会和面向对象编程合作得很好。
Spring中的Aop:
第一种方式:spring中Api接口实现AOP:
接口方法:
1、导入aspectjweaver依赖
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency>
2、编写接口和实现类
public interface BookDao { //增删查改 public void addBook(); public void deleteBook(); public void selectBook(); public void updateBook(); }
public class BookDaoImpl implements BookDao { public void addBook() { System.out.println("增加了一本书"); } public void deleteBook() { System.out.println("删除了一本书"); } public void selectBook() { System.out.println("查找了一本书"); } public void updateBook() { System.out.println("更新了一本书"); } }
要向切口插入的功能
public class Log implements MethodBeforeAdvice { //method: 要执行的目标对象的方法 //args:参数 //target:目标对象 public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println(o.getClass().getName()+"的"+method.getName()+"方法执行了"); } }
3、编写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" 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/aop https://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id="bookDaoImpl" class="com.song.service.BookDaoImpl"> </bean> <bean id="log" class="com.song.log.Log"/> <!-- 配置aop--> <aop:config> <!-- 切入点--> <aop:pointcut id="pointcut" expression="execution(* com.song.service.BookDaoImpl.*(..))"/> <!--要切入的方法--> <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> </aop:config> </beans>
4、测试:
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); //代理类代理的是一个接口而不是实现类 BookDao bookDaoImpl = (BookDao) context.getBean("bookDaoImpl"); bookDaoImpl.addBook(); }
结果:
第二种方式:自定义切面类
1、自定义通知类
//自定义通知方法 public class Aspect { public void before(){ System.out.println("方法执行前"); } public void after(){ System.out.println("方法执行后"); } }
2、xml
<aop:config> <aop:aspect ref="aspect"> <aop:pointcut id="point" expression="execution(* com.song.service.BookDaoImpl.*(..))"/> <!-- 要实现的通知方法--> <aop:before method="before" pointcut-ref="point"/> <aop:after method="after" pointcut-ref="point"/> </aop:aspect> </aop:config>
3、测试
第三种方式:注解方式!
很简单;标志切面类–》标志通知–》配置xml开启注解支持
@Aspect public class AspectAnoation { @Before("execution(* com.song.service.BookDaoImpl.*(..))") public void before(){ System.out.println("方法执行前"); } @After("execution(* com.song.service.BookDaoImpl.*(..))") public void after(){ System.out.println("方法执行后"); } }
<bean id="AspectAnoation" class="com.song.diy.AspectAnoation"/> <!-- 开起注解支持--> <aop:aspectj-autoproxy/>
整合Mybatis
mybatis简单复习
总配置文件——>编写实体类——>编写接口——>编写接口对应xml文件——>测试
1、导入所有依赖:
junit
mybatis
mysql数据库
spring相关
aop织入器
mybatis-spring整合包【重点】在此还导入了lombok包。
配置Maven静态资源过滤问题!
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <dependencies> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.24</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build> </project>
2、实体类
@Data public class User { private int userId; private String userName; private String password; private String sex; private String email; }
3、接口及对应的配置文件
public interface UserMapper { List<User> getUser(); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.song.mapper.UserMapper"> <select id="getUser" resultType="com.song.pojo.User"> select * from users </select> </mapper>
4、mybatisconfig配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/testweb?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/song/mapper/UserMapper.xml"/> </mappers> </configuration>
5、工具包:
public class MybatisUtil { //sqlSessionFactory --> sqlSession static SqlSessionFactory sqlSessionFactory = null; static { try { //使用Mybatis第一步 :获取sqlSessionFactory对象 String resource = "mybatisConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例. // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
6、测试:
@Test public void test(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.getUser(); }
整合方式一
鸟瞰图:Spring-Mybatis
以下为过程对应代码
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd "> <!-- 2、数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="username" value="root"/> <property name="url" value="jdbc:mysql://localhost:3306/testweb?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/> <property name="password" value="123456"/> </bean> <!-- 3、SqlSessionFactoryBean工程--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatisConfig.xml"/> <property name="mapperLocations" value="classpath:com/song/mapper/*.xml"/> </bean> <!-- 4、注入--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> <!-- 6、注册bean--> <bean id="userMapper" class="com.song.mapper.UserMapperImpl"> <property name="sqlSessionTemplate" ref="sqlSession"/> </bean> </beans>
实现类:
//创建实现类配合bean public class UserMapperImpl implements UserMapper { //sqlsession private SqlSessionTemplate sqlSessionTemplate; //set方法用来注入 public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; }
整合方式三:
和方式二前四步一样,第五步不再创建私有方法而是继承一个类,调用类方法得到sqlSession,道理还是一样
实现类:
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper { public List<User> getUser() { return getSqlSession().getMapper(UserMapper.class).getUser(); } }
bean:
<bean id="userMapper2" class="com.song.mapper.UserMapperImpl2"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
最后
在文章的最后作者为大家整理了很多资料!包括java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书等等!
欢迎关注公众号:前程有光,领取!
架构人生
前程有光
0 条评论
前程有光
宣传栏
目录
Spring及IOC介绍
Spring简介
Rod Johnson,Spring Framework创始人,著名作者。很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
Spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!
SSH:Struct2 + Spring + Hibernate!
SSM:SpringMVC + Spring + Mybatis!
依赖导入:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.5</version> </dependency>
总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架
缺点:“配置繁琐,配置地狱” 所以SpringBoot就出来了
IOC:以前程序主动权在程序员手中,用户需求得通过程序员修改,IOC就是改变这种手段,将控制权交到用户手中:控制反转。大大解除了程序的耦合性,这样程序员就可以更加专注于业务层开发
IOC创建及重点配置
新建Maven项目,导入依赖,编写实体类
@Data public class Student { private String name; private int id;
编写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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 实体类映射--> <!-- 默认使用无参构造函数创建对象,--> <!-- 若要使用有参,需要用<constructor-arg--> <bean id="student" class="com.song.pojo.Student"> <constructor-arg name="name" value="mike"/> <constructor-arg name="id" value="2"/> <property name="name" value="hehe"/> </bean> <!-- <bean id="..." class="...">--> </beans>
测试
public class myTest { @Test public void test(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml"); Student student = (Student) applicationContext.getBean("student"); System.out.println(student.toString()); } }
思考:对象是如何创建的?
Spring自动创建对象,由Spring容器给对象属性赋值
这个过程就称为控制反转
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。
反转:程序本身不创建对象,变成被动的接受Spring容器创建的对象
容器通过set方法进行属性值的注入
对象由Spring来创建,管理,装配!
Spring重点配置!
<!-- id:bean的唯一标识符,也就是相当于我们学的对象名 class:bean对象所对应的全限定名:包名+类名 name:也是别名,而且name可以同时取多个别名 --> <bean id="userT" class="com.kuang.pojo.UserT" name="user2 u2,u3;u4"> <property name="name" value="吴亦凡"/> </bean> <import resource=baen.xml/>
依赖注入以及自动装Bean
当实体类出现复杂属性时如下:
@Data public class Person { private String name;//名字 private Cat cat;//宠物 private String[] books;//书籍 private List<String> hobbies;//爱好 private Map<String,String> card;//卡 private Set<String> games;//游戏 private String wife;//妻子 private Properties info;//配置信息 private Dog dog; }
引用注入 cat
<!-- 引用 ref--> <property name="cat" ref="cat"/> <bean id="cat" class="com.pojo.Cat"/>
数组 books
<!-- 数组 arry--> <property name="books"> <array> <value>java核心技术</value> <value>jvm入门</value> <value>数据库入门到入土</value> <value>西游记</value> </array> </property>
list、set集合 hobbies games
<!-- list集合 List--> <property name="hobbies"> <list> <value>唱</value> <value>跳</value> <value>rap</value> </list> </property>
set时换一下关键字即可
map集合 card
<!-- Map集合 map--> <property name="card"> <map> <entry key="身份证" value="5206565656565"/> <entry key="银行卡" value="111111111111111"/> </map> </property>
null wife
<!-- null--> <property name="wife"> <null/> </property>
properties info
<property name="info"> <props> <prop key="url">https//www.baidu.com</prop> <prop key="driver">https//www.baidu.com</prop> </props> </property>
自动装配Bean
缘由:当一个实体类中有其他类的引用属性时我们通常在xml中采用ref的方式指向另一个Bean,这种方式很繁琐,如下:
<bean id="student" class="com.song.Student"> <property name="name" value="mike"/> <property name="sex" value="男"/> <property name="dog" ref="dog"/> <property name="cat" ref="cat"/> </bean> <bean id="dog" class="com.song.Dog"/> <bean id="cat" class="com.song.Cat"/>
而自动装配有主要两种方式:xml中autowire自动装配和注解自动装配
xml
在bean标签中加入autowire标签即可
小结:
ByName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!
ByType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!
使用注解实现自动装配
特别简单 导入注解约束——》配置注解的支持——》使用@Autowire注解
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" xmlns:context="http://www.springframework.org/schema/context" 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" >
使用注解
@Value("吴亦凡") private String name; private String sex; @Autowired private Dog dog; @Autowired private Cat cat;
使用@Resource(java内置),用法和上面一样,
区别:@Autowired优先byType,@Resource优先byName然后byType
使用注解开发(improtant)
1、导入AOP包和约束
aop包在导入Springwebmvc时候就一起导入进来了
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd" > //扫描包下的注解 <context:component-scan base-package="com.song"/> <context:annotation-config/> </beans>
AOP
Aop:Aspect Oriented Programming的缩写,意思是面向切面编程,动态的在程序运行期间找个切点将一段程序执行插入进去,实现了在不改动源程序的基础下增加功能;
优点:有了 AOP,我们可以定义交叉的关系,并将这些关系应用于跨模块的、彼此不同的对象模型。AOP 同时还可以让我们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护。它会和面向对象编程合作得很好。
Spring中的Aop:
第一种方式:spring中Api接口实现AOP:
接口方法:
1、导入aspectjweaver依赖
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency>
2、编写接口和实现类
public interface BookDao { //增删查改 public void addBook(); public void deleteBook(); public void selectBook(); public void updateBook(); }
public class BookDaoImpl implements BookDao { public void addBook() { System.out.println("增加了一本书"); } public void deleteBook() { System.out.println("删除了一本书"); } public void selectBook() { System.out.println("查找了一本书"); } public void updateBook() { System.out.println("更新了一本书"); } }
要向切口插入的功能
public class Log implements MethodBeforeAdvice { //method: 要执行的目标对象的方法 //args:参数 //target:目标对象 public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println(o.getClass().getName()+"的"+method.getName()+"方法执行了"); } }
3、编写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" 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/aop https://www.springframework.org/schema/aop/spring-aop.xsd "> <bean id="bookDaoImpl" class="com.song.service.BookDaoImpl"> </bean> <bean id="log" class="com.song.log.Log"/> <!-- 配置aop--> <aop:config> <!-- 切入点--> <aop:pointcut id="pointcut" expression="execution(* com.song.service.BookDaoImpl.*(..))"/> <!--要切入的方法--> <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> </aop:config> </beans>
4、测试:
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); //代理类代理的是一个接口而不是实现类 BookDao bookDaoImpl = (BookDao) context.getBean("bookDaoImpl"); bookDaoImpl.addBook(); }
结果:
第二种方式:自定义切面类
1、自定义通知类
//自定义通知方法 public class Aspect { public void before(){ System.out.println("方法执行前"); } public void after(){ System.out.println("方法执行后"); } }
2、xml
<aop:config> <aop:aspect ref="aspect"> <aop:pointcut id="point" expression="execution(* com.song.service.BookDaoImpl.*(..))"/> <!-- 要实现的通知方法--> <aop:before method="before" pointcut-ref="point"/> <aop:after method="after" pointcut-ref="point"/> </aop:aspect> </aop:config>
3、测试
第三种方式:注解方式!
很简单;标志切面类–》标志通知–》配置xml开启注解支持
@Aspect public class AspectAnoation { @Before("execution(* com.song.service.BookDaoImpl.*(..))") public void before(){ System.out.println("方法执行前"); } @After("execution(* com.song.service.BookDaoImpl.*(..))") public void after(){ System.out.println("方法执行后"); } }
<bean id="AspectAnoation" class="com.song.diy.AspectAnoation"/> <!-- 开起注解支持--> <aop:aspectj-autoproxy/>
整合Mybatis
mybatis简单复习
总配置文件——>编写实体类——>编写接口——>编写接口对应xml文件——>测试
1、导入所有依赖:
junit
mybatis
mysql数据库
spring相关
aop织入器
mybatis-spring整合包【重点】在此还导入了lombok包。
配置Maven静态资源过滤问题!
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <dependencies> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.24</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build> </project>
2、实体类
@Data public class User { private int userId; private String userName; private String password; private String sex; private String email; }
3、接口及对应的配置文件
public interface UserMapper { List<User> getUser(); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.song.mapper.UserMapper"> <select id="getUser" resultType="com.song.pojo.User"> select * from users </select> </mapper>
4、mybatisconfig配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/testweb?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/song/mapper/UserMapper.xml"/> </mappers> </configuration>
5、工具包:
public class MybatisUtil { //sqlSessionFactory --> sqlSession static SqlSessionFactory sqlSessionFactory = null; static { try { //使用Mybatis第一步 :获取sqlSessionFactory对象 String resource = "mybatisConfig.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例. // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
6、测试:
@Test public void test(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.getUser(); }
整合方式一
鸟瞰图:Spring-Mybatis
以下为过程对应代码
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd "> <!-- 2、数据源--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="username" value="root"/> <property name="url" value="jdbc:mysql://localhost:3306/testweb?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/> <property name="password" value="123456"/> </bean> <!-- 3、SqlSessionFactoryBean工程--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatisConfig.xml"/> <property name="mapperLocations" value="classpath:com/song/mapper/*.xml"/> </bean> <!-- 4、注入--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean> <!-- 6、注册bean--> <bean id="userMapper" class="com.song.mapper.UserMapperImpl"> <property name="sqlSessionTemplate" ref="sqlSession"/> </bean> </beans>
实现类:
//创建实现类配合bean public class UserMapperImpl implements UserMapper { //sqlsession private SqlSessionTemplate sqlSessionTemplate; //set方法用来注入 public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) { this.sqlSessionTemplate = sqlSessionTemplate; }
整合方式三:
和方式二前四步一样,第五步不再创建私有方法而是继承一个类,调用类方法得到sqlSession,道理还是一样
实现类:
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper { public List<User> getUser() { return getSqlSession().getMapper(UserMapper.class).getUser(); } }
bean:
<bean id="userMapper2" class="com.song.mapper.UserMapperImpl2"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
最后
在文章的最后作者为大家整理了很多资料!包括java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书等等!
欢迎关注公众号:前程有光,领取!