Spring5框架(上) IOC
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相关推荐
- Spring5框架-IOC容器
Spring5框架 Spring包下载快照 一.Spring简绍 1什么是Spring 1.Spring是轻量级的开源的JAVAEE框架,可以解决企业应用开发的复杂性 2.Spring有两个核心的部分 ...
- 001 spring5框架:java类工程,IOC:实体类表示表关系,AOP,JdbcTemplate模板,事务操作,Spring5 框架新功能:日志,为空注解,函数式风格,juint,Webflux
1. Spring5 框架(Spring5 Framework)介绍 1.1 概念 1.Spring 是轻量级的开源的 JavaEE 框架 2.Spring 可以解决企业应用开发的复杂性 3.Spri ...
- Spring5 框架概述 、IOC 容器
一.Spring5 框架概述 介绍 Spring 是轻量级的开源的 JavaEE 框架 Spring 可以解决企业应用开发的复杂性 Spring 有两个核心部分:IOC 和 Aop (1)IOC:控制 ...
- Spring5参考指南:IOC容器
文章目录 为什么使用Spring5 什么是IOC容器 配置元数据 实例化容器 XML嵌套 groovy bean定义DSL 使用容器 最近在翻译Spring Framework Documentati ...
- Java总结:Spring5框架(1)
Spring5框架(1) 一:什么是Spring? Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用 ...
- Spring5 框架
Spring5 框架 一.Spring概述 Spring是轻量级的开源的JavaEE框架. Spring可以解决企业应用开发的复杂性. Spring有两个核心部分:IOC和AOP. IOC:控制反转, ...
- Java系列技术之Spring5框架-钟洪发-专题视频课程
Java系列技术之Spring5框架-33人已学习 课程介绍 Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个 ...
- Spring5框架学习
Spring5框架学习 备注:视频来源于尚硅谷 - Spring 5 框架最新版教程(idea版):https://www.bilibili.com/video/BV1Vf4y127N5 Spring ...
- Boost:使用OpenCV在图像或相机框架上应用sobel过滤器
Boost:使用OpenCV在图像或相机框架上应用sobel过滤器 实现功能 C++实现代码 实现功能 Boost的compute模块,使用OpenCV在图像或相机框架上应用sobel过滤器 C++实 ...
最新文章
- elasticsearch 安装
- 神经网络反向传播梯度计算数学原理
- python自学免费课堂-如何系统地自学 Python?
- matlab 生成不重复的随机整数 打乱数据排列 生成深度学习数据集
- 流水线、超流水线、超标量技术对比
- ORACLE11G RAC 在 centeros5.5 的安装日志
- webpack html转成js,WebPack的基础学习
- arcgis 获取json经纬度_干货|ArcGIS的矢量化操作——ArcGis中进行地形图的配准
- Spring Cloud Zuul支持–配置超时
- 各种蕴含算法思想的DP - 3
- 各个层次的gcc警告
- 泰囧成功背后社会化营销功不可没
- EasyNVR摄像机H5流媒体服务器在windows上批处理脚本自动以管理员权限运行
- ****** 四 ******、软设笔记【数据结构】-排序、插入排序、选择排序
- ObjectC----NSObject常用方法和OC反射机制
- flash builder4.6 集成svn1.8报错
- oracle+suspend+参数,oracle数据库的挂起(Suspending)和恢复(Resuming)
- 08-go mod和vendor
- 8.PPP拨号 获取ip地址
- 一文解读广告投放落地页