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我的项目,导入依赖,编写实体类
@Datapublic 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
当实体类呈现简单属性时如下:
@Datapublic 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开启注解反对
@Aspectpublic 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、实体类
@Datapublic 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>
实现类:
//创立实现类配合beanpublic 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架构实战电子书等等!
欢送关注公众号:前程有光,支付!