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架构实战电子书等等!
欢迎关注公众号:前程有光,领取!
网友评论