Spring5框架 IOC

  • 前言
  • Spring框架概述
  • IOC容器
    • 底层原理
    • Bean管理XML方式(创建对象和set注入属性)
      • 注入集合类型属性1
    • IOC操作Bean管理
      • Bean管理(工厂Bean)
      • Bean管理(bean的作用域)
      • Bean管理(bean生命周期)
      • Bean管理XML方式(自动装配)
      • Bean管理XML方式(外部属性文件)
    • Bean管理注解方式
      • 创建对象
      • 开启组件扫描细节配置
      • 注入属性@Autowired和@Qualifier
      • 完全注解开发
  • end

前言

内容概览

  • Spring框架概述
  • IOC容器
  • AOP
  • JdbcTemplate
  • 事务管理
  • Spring5新特性

Spring框架概述

1、Spring是轻量级的开源的JavaEE框架
2、Spring可以解决企业应用开发的复杂性
3、Spring有两个核心部分:IOC和AOP

  • IOC:控制反转,把创建对象过程交给Spring进行管理
  • AOP:面向切面,不修改源代码进行功能增强

4、Spring特点

  • 方便解耦,简化开发
  • AOP编程支持
  • 方便程序的测试
  • 方便集成各种优秀框架
  • 方便进行事务操作
  • 降低API开发难度
  • 源码造诣高深,值得学习

5、选取Spring版本5.X

入门案例 5.2.6 ,创建一个普通java工程

因为是简单入门案例,只需引入核心包 中的模块jar包

复制至工程根目录lib文件下,并创建一个普通 类 User和 xml配置文件

Spring配置文件

<?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:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- --><bean id="user" class="com.zhu.spring5.User"></bean>
</beans>

测试类中,测试用springbean 创建了对象并调用对象方法

public class TestSpring5 {@Testpublic void testAdd(){//1、加载spring配置文件ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");//2、获取配置创建的对象User user = context.getBean("user", User.class);System.out.println(user);user.add();}
}

IOC容器

底层原理

1、什么是IOC

  • 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
  • 使用IOC目的:为了耦合度降低
  • 做入门案例就是IOC实现

2、IOC底层原理

  • 主要用到有三个技术:xml解析、工厂模式、反射

3、看图理解IOC底层原理及IOC演变过程

4、IOC中重要的接口

  • IOC思想给予IOC容器完成,IOC容器底层本质就是上图对象工厂
  • Spring提供IOC容器两种实现方式;(两个接口)
    (1)BeanFactory:IOC容器基本实现,是Spring框架内部的使用接口,不建议开发人员使用
    *加载xml配置文件的时候不会创建对象,只在获取(使用)对象是才去创建对象
    (2)ApplicationContext:BeanFactory接口的子接口,提供更强大的功能,提供给开发人员使用
    *加载配置文件的时候就会把配置文件中所有的对象进行创建

结合JavaWeb环境,所有对象在项目启动时创建完成,而不是在使用到了才去创建,所以第二种更合适

  • ApplicationContext接口有两个主要的实现类

File类需要传入配置文件绝对路径
Class类只需传入相对src文件的类路径

Bean管理XML方式(创建对象和set注入属性)

  • 什么是Bean管理

(1)Bean管理指的是两个操作
(2)Spring创建对象
(3)Spring给对象注入属性

  • Bean管理操作有两种方式
    (1)基于xml配置文件方式实现
    (2)基于注解方式实现
  • IOC操作Bean管理(基于xml方式)

1、基于xml方式创建对象

<bean id="user" class="com.zhu.spring5.User"></bean>

(1)在sprig配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
(2)在bean标签的常用属性
id属性:唯一标识
class属性:类全路径

(3)创建对象时默认执行此类的无参构造器,若声明了有参构造器,未声明无参构造器,则会报错。

2、基于xml方式注入属性
(1)DI:依赖注入,就是注入属性

3、第一种注入方式:使用set方法注入
(1)创建类定义属性和set方法
(2)在spring配文件配置对象创建,配置属性注入

<bean id="book" class="com.zhu.spring5.Book"><property name="bName" value="红楼梦"></property><property name="bauthor" value="曹雪芹"></property>
</bean>

4、第二种注入方式:使用有参构造器进行注入
(1)创建类。定义属性,创建有参构造器
(2)在spring配文件配置对象创建,配置属性注入

<bean id="book" class="com.zhu.spring5.Book"><constructor-arg name="bauthor" value="吴承恩"></constructor-arg><constructor-arg name="bName" value="西游记"></constructor-arg>
</bean>

5、p名称空间注入(仅了解)
(1)使用p名称空间注入,可以简化基于xml配置方式
第一步,添加xml 配置
xmlns:p="http://www.springframework.org/schema/p"
第二步

<bean id="book" class="com.zhu.spring5.Book" p:bName="九阳神功" p:bauthor="无名氏">
</bean>
  • xml注入其他类型属性

1、字面量:定义属性时就赋予的值
(1)null值

<bean id="book" class="com.zhu.spring5.Book"><property name="bName"><null></null></property>
</bean>

(2)属性值包含特殊符号

<bean id="book" class="com.zhu.spring5.Book"><property name="bName"><value><![CDATA[<<特殊符号>>]]></value></property>
</bean>

2、注入属性-外部bean
(1) 创建两个类service类和dao类
(2)在service调用dao里面的方法
(3)在spring配置文件中配置

<bean id="userService" class="com.zhu.spring5.service.UserService"><property name="userDao" ref="userDao"></property>
</bean><bean id="userDao" class="com.zhu.spring5.dao.UserDaoImpl"></bean>

3、注入属性-内部bean
(1)一对多关系:部门和员工
一个部门有多个员工,一个员工属于一个部门,部门一,员工多。
(2)在实体类中表示一对多关系

(3)在spring配置文件中配置

<!--内部bean-->
<bean id="emp" class="com.zhu.spring5.bean.Emp"><!--设置两个普通属性--><property name="ename" value="lucy"></property><property name="gender" value="女"></property><!--设置对象类型属性--><property name="dept"><bean id="dept" class="com.zhu.spring5.bean.Dept"><property name="dname" value="安保部"></property></bean></property>
</bean>

4、注入属性-级联赋值

<!--级联赋值-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp"><!--设置两个普通属性--><property name="ename" value="lucy"></property><property name="gender" value="女"></property><!--级联赋值--><property name="dept" ref="dept"></property><!--需要对象有get方法--><property name="dept.dname" value="技术部"></property>
</bean>
<bean id="dept" class="com.atguigu.spring5.bean.Dept"><property name="dname" value="财务部"></property>
</bean>

注入集合类型属性1

1、注入数组类型属性

2、注入List集合类型属性

3、注入Map集合类型属性

4、设置对象类型的值

//学生所学多门课程
private List<Course> courseList;
<!--1 集合类型属性注入-->
<bean id="stu" class="com.atguigu.spring5.collectiontype.Stu"><!--数组类型属性注入--><property name="courses"><array><value>java课程</value><value>数据库课程</value></array></property><!--list类型属性注入--><property name="list"><list><value>张三</value><value>小三</value></list></property><!--map类型属性注入--><property name="maps"><map><entry key="JAVA" value="java"></entry><entry key="PHP" value="php"></entry></map></property><!--set类型属性注入--><property name="sets"><set><value>MySQL</value><value>Redis</value></set></property><!--注入list集合类型,值是对象-->对象类型的值<property name="courseList"><list><ref bean="course1"></ref><ref bean="course2"></ref></list></property>
</bean><!--创建多个course对象。-->
<bean id="course1" class="com.atguigu.spring5.collectiontype.Course"><property name="cname" value="Spring5框架"></property>
</bean>
<bean id="course2" class="com.atguigu.spring5.collectiontype.Course"><property name="cname" value="MyBatis框架"></property>
</bean>

5、把集合注入部分提取出来
(1)在spring配置文件中引入名称空间util
xmlns:util="http://www.springframework.org/schema/util"
(2)使用util标签完成list集合注入提取

<!--1 提取list集合类型属性注入-->
<util:list id="bookList"><value>易筋经</value><value>九阴真经</value><value>九阳神功</value>
</util:list><!--2 提取list集合类型属性注入使用-->
<bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype"><property name="list" ref="bookList"></property>
</bean>

IOC操作Bean管理

Bean管理(工厂Bean)

1、Spring有两种类型bean,一种普通bean,另一种工厂bean(FactoryBean)

2、普通bean:在配置文件中定义bean类型就是返回类型

3、工厂bean:在配置文件定义bean类型可以和返回类型不一样

第一步:创建类,让这个类作为工厂bean,实现接口FactoryBean
getObject方法决定了返回的类型

public class MyBean implements FactoryBean<Course> {//定义返回bean@Overridepublic Course getObject() throws Exception {Course course = new Course();course.setCname("abc");return course;}
}
<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean"></bean>

第二部:实现接口里面的方法,在实现的方法中定义返回的bean类型
getObject方法规定了是什么类型,返回就是什么类型

ApplicationContext context = new ClassPathXmlApplicationContext("bean3.xml");
Course myBean = context.getBean("myBean", Course.class);
System.out.println(myBean);

Bean管理(bean的作用域)

1、在Spring中,可以设置创建bean实列是单实列还是多实例

2、在Spring中,默认情况下,bean是单实例
(2)scope属性值
第一个值 默认值,singleton,表示是单实例
第二个值 prototype ,表示多实例

<bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype"><property name="list" ref="bookList"></property>
</bean>

(3)singleton 和 prototype区别

singleton时,加载spring配置文件时候就会创建单实例对象
prototype时,不是在加载配置文件时创建对象,在调用getBean方法时候创建多实例对象

Bean管理(bean生命周期)

1、生命周期
(1) 从对象创建到对象销毁的过程

2、bean的生命周期
(1) 执行无参构造器创建bean实例(无参构造)
(2) 为bean的属性设置值和对其他bean引用(调用set方法)
(3) 调用bean的初始化的方法(需要进行配置初始化的方法)
(4) bean可以使用了(对象获取到了)
(5) 当容器关闭时,调用bean到销毁方法(需要进行配置销毁的方法)

3、演示bean生命周期

public class Orders {//无参数构造public Orders() {System.out.println("第一步 执行无参数构造创建bean实例");}private String oname;public void setOname(String oname) {this.oname = oname;System.out.println("第二步 调用set方法设置属性值");}//创建执行的初始化的方法public void initMethod() {System.out.println("第三步 执行初始化的方法");}//创建执行的销毁的方法public void destroyMethod() {System.out.println("第五步 执行销毁的方法");}
}@Test
public void test4() {//        ApplicationContext context =
//                new ClassPathXmlApplicationContext("bean4.xml");ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("bean4.xml");Orders orders = context.getBean("orders", Orders.class);System.out.println("第四步,获取创建bean实例对象");System.out.println(orders);context.close();
}
<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"><property name="oname" value="手机"></property>
</bean>

4、bean的后置处理器 加上后置处理器后有7步,在调用bean的初始化方法前后

把bean实例传递bean后置处理器的方法
(3) 调用bean的初始化的方法(需要进行配置初始化的方法)
把bean实例传递bean后置处理器的方法

5、演示添加后置处理器效果
创建类 ,主要是实现 接口 BeanPostProcessor和他的两个方法,而后,当前配置文件的所有bean的创建都会执行后置处理的方法

public class MyBeanPost implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("在初始化之前执行的方法");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("在初始化之后执行的方法");return bean;}
}
<bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"></bean>

Bean管理XML方式(自动装配)

1、 什么是自动装配
根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入

2、演示自动装配过程
byType会根据对象类型扫描当前配置文件中符合注入条件的类
byName会属性名扫描当前配置文件中符合注入条件的类

Bean管理XML方式(外部属性文件)

1、直接配置数据库信息
(1)配置德鲁伊连接池
(2)引入德鲁伊连接池依赖jar包
2、引入外部属性文件配置数据库连接池
xml加入context名称空间

<?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:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="classpath:jdbc.properties"/><!--配置连接池--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${prop.driverClass}"></property><property name="url" value="${prop.url}"></property><property name="username" value="${prop.userName}"></property><property name="password" value="${prop.password}"></property></bean></beans>

Bean管理注解方式

1、什么是注解
(1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值)

(2)使用注解,注解作用在类、方法、属性、参数列表

(3)使用注解目的:简化xml配置

2、Spring针对Bean姑那里创建对象提供注解
@Component 表示普通的组件
@Service 一般用在业务逻辑层
@Controller 一般用在web层
@Repository 一般用在dao持久层
*上面四个注解功能是一样的,都可以用来创建bean实例,用在不同层是为让开发人员更清晰当前组件所扮演的角色,实际中混用也是可以的

创建对象

基于注解方式实现对象创建
第一步 引入依赖

第二部 开启组件扫描

<context:component-scan base-package="com.atguigu.spring5"></context:component-scan>

第三部 创建类,在类上面添加创建对象注解

//在注解里,value属性值可以省略
//默认是类名首字母小写
//@Component(value = "userService")
@Service(value = "userService")
public class UserService {public void add(){System.out.println("service add......");}
}@Test
public void testService1() {ApplicationContext context= new ClassPathXmlApplicationContext("bean1.xml");UserService userService = context.getBean("userService", UserService.class);System.out.println(userService);userService.add();
}

开启组件扫描细节配置

注入属性@Autowired和@Qualifier

(1)@Autowired:根据属性类型进行自动装配
第一步 把service和dao 对象创建,在service 和 dao类添加创建对象注解
第二步 在service注入dao对象,在service类添加dao类型属性,在属性上使用注解

@Service(value = "userService")
public class UserService {@Autowiredprivate UserDao userDao;public void add(){System.out.println("service add......");userDao.add();}
}

(2)@Qualifier:根据属性名称进行注入
这个注解,必须和上面@Autowired一起使用
若@Qualifier 内的value值和被注入value值不一致,则找不到要被注入的对象,失败报错

@Autowired
@Qualifier(value = "userDaoImpl")
private UserDao userDao;@Repository(value = "userDaoImpl")
public class UserDaoImpl implements UserDao{@Overridepublic void add() {System.out.println("userdao add//....");}
}

(3)@Resource:根据类型根据名称注入

@Resource(name = "userDaoImpl")
private UserDao userDao;

(4)@Vlaue:注入普通类型属性

相当于set。给属性复制

@Value(value = "abc")
private String name;

完全注解开发

(1)创建配置类,替代xml配置文件

@Configuration  //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.atguigu.spring5"})
public class SpringConfig {}

(2)编写测试类

@Test
public void testService2() {ApplicationContext context= new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = context.getBean("userService", UserService.class);System.out.println(userService);userService.add();
}

end

Spring5框架(上) IOC相关推荐

  1. Spring5框架-IOC容器

    Spring5框架 Spring包下载快照 一.Spring简绍 1什么是Spring 1.Spring是轻量级的开源的JAVAEE框架,可以解决企业应用开发的复杂性 2.Spring有两个核心的部分 ...

  2. 001 spring5框架:java类工程,IOC:实体类表示表关系,AOP,JdbcTemplate模板,事务操作,Spring5 框架新功能:日志,为空注解,函数式风格,juint,Webflux

    1. Spring5 框架(Spring5 Framework)介绍 1.1 概念 1.Spring 是轻量级的开源的 JavaEE 框架 2.Spring 可以解决企业应用开发的复杂性 3.Spri ...

  3. Spring5 框架概述 、IOC 容器

    一.Spring5 框架概述 介绍 Spring 是轻量级的开源的 JavaEE 框架 Spring 可以解决企业应用开发的复杂性 Spring 有两个核心部分:IOC 和 Aop (1)IOC:控制 ...

  4. Spring5参考指南:IOC容器

    文章目录 为什么使用Spring5 什么是IOC容器 配置元数据 实例化容器 XML嵌套 groovy bean定义DSL 使用容器 最近在翻译Spring Framework Documentati ...

  5. Java总结:Spring5框架(1)

    Spring5框架(1) 一:什么是Spring? Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用 ...

  6. Spring5 框架

    Spring5 框架 一.Spring概述 Spring是轻量级的开源的JavaEE框架. Spring可以解决企业应用开发的复杂性. Spring有两个核心部分:IOC和AOP. IOC:控制反转, ...

  7. Java系列技术之Spring5框架-钟洪发-专题视频课程

    Java系列技术之Spring5框架-33人已学习 课程介绍         Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个 ...

  8. Spring5框架学习

    Spring5框架学习 备注:视频来源于尚硅谷 - Spring 5 框架最新版教程(idea版):https://www.bilibili.com/video/BV1Vf4y127N5 Spring ...

  9. Boost:使用OpenCV在图像或相机框架上应用sobel过滤器

    Boost:使用OpenCV在图像或相机框架上应用sobel过滤器 实现功能 C++实现代码 实现功能 Boost的compute模块,使用OpenCV在图像或相机框架上应用sobel过滤器 C++实 ...

最新文章

  1. elasticsearch 安装
  2. 神经网络反向传播梯度计算数学原理
  3. python自学免费课堂-如何系统地自学 Python?
  4. matlab 生成不重复的随机整数 打乱数据排列 生成深度学习数据集
  5. 流水线、超流水线、超标量技术对比
  6. ORACLE11G RAC 在 centeros5.5 的安装日志
  7. webpack html转成js,WebPack的基础学习
  8. arcgis 获取json经纬度_干货|ArcGIS的矢量化操作——ArcGis中进行地形图的配准
  9. Spring Cloud Zuul支持–配置超时
  10. 各种蕴含算法思想的DP - 3
  11. 各个层次的gcc警告
  12. 泰囧成功背后社会化营销功不可没
  13. EasyNVR摄像机H5流媒体服务器在windows上批处理脚本自动以管理员权限运行
  14. ****** 四 ******、软设笔记【数据结构】-排序、插入排序、选择排序
  15. ObjectC----NSObject常用方法和OC反射机制
  16. flash builder4.6 集成svn1.8报错
  17. oracle+suspend+参数,oracle数据库的挂起(Suspending)和恢复(Resuming)
  18. 08-go mod和vendor
  19. 8.PPP拨号 获取ip地址
  20. 一文解读广告投放落地页

热门文章

  1. 洛谷 P1294 高手去散步
  2. 计算机d盘d桌面不见了,打开电脑,D、E、F盘不见了,怎么处理?
  3. 2021/03/09~2021/08/19 统计
  4. 《初窥“思维导图”》
  5. 013 | 民间戏剧类非物质文化遗产的保护与传承 | 大学生创新训练项目申请书 | 极致技术工厂
  6. 快速编译黑苹果引导OpenCore文字与视频
  7. GARP和GVRP的简介
  8. PKG文件内容和定义
  9. 2020电力英语及计算机考试题库,电力英语考试题库
  10. 十分钟深入理解const用法(趣味故事)