狂神说JavaSpring详解
Posted 闲言_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了狂神说JavaSpring详解相关的知识,希望对你有一定的参考价值。
目录
- 狂神视频地址
- 1、Spring
- 2、IOC理论推导
- 3、IOC本质
- 4、Spring 入门程序
- 5、IOC创建对象的方式
- 6、Spring配置
- 7、依赖注入
- 9、bean的作用域
- 10.Bean的自动装配
- 11、注解实现自动装配
- 12、使用注解开发
- 13、java的方式配置Spring
- 14、代理模式
- 15、静态代理
- 16、动态代理
- 17、基于Proxy类和InvocationHandler 实现动态代理
- 17-2.被代理的接口
- 18、基于Proxy类和InvocationHandler 实现动态代理 2
- 19、动态代理和静态代理总结
- 20、什么是Aop
- 21、Aop 实现方式1-基于原生API
- 22、Aop 实现方式2-切面方式
- 23、Aop 实现方式3-注解方式
- 24、Spring 整合Mybatis
- 25、声明式事务
- 26、声明式事务代码
狂神视频地址
1、Spring
1-1.Spring 简介
Spring:春天------>给软件行业带来了春天!
2002,首次推出了Spring框架的雏形:interface21框架!
Spring框架即以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日发布了1.0正式版。
Rod Johnson,Spring Framework创始人,著名作者。很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。
Spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!
1-2.Spring 的优点
- Spring是一个开源的免费的框架(容器)!
- Spring是一个轻量级的、非入侵式的框架!
- 控制反转(IOC),面向切面编程(AOP)!
- 支持事务的处理,对框架整合的支持!
总结一句话:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!
1-3.Spring 组成
1-4.Spring 拓展
现代化的Java开发!说白就是基于Spring的开发!
Spring Boot
- 一个快速开发的脚手架。
- 基于SpringBoot可以快速的开发单个微服务。
- 约定大于配置。
Spring Cloud
- SpringCloud是基于SpringBoot实现的。
- 因为现在大多数公司都在使用SpringBoot进行快速开发,学习SpringBoot的前提,需要完全掌握Spring及SpringMVC!承上启下的作用!
弊端:发展了太久之后,违背了原来的理念!配置十分繁琐,人称:“配置地狱!”
2、IOC理论推导
2-1.UserDao 接口
public interface UserDao
void getUser();
2-2.UserDaoImpl 实现类
public class UserDaoImpl implements UserDao
public void getUser()
System.out.println("获取用户数据");
2-3.UserService 业务接口
public interface UserService
void getUser();
2-4.UserServiceImpl 业务实现类
public class UserServiceImpl implements UserService
UserDao userDao = new UserDaoImpl();
public void getUser()
userDao.getUser();
2-5.测试
public class Test
public static void main(String[] args)
UserService userService = new UserServiceImpl();
userService.getUser();
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!
我们使用一个Set接口实现,已经发生了革命性的变化!
UserDao userDao;
public void setUserDao(UserDao userDao)
this.userDao = userDao;
之前,程序是主动创建对象!控制权在程序员手上!
使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象!
控制反转了,主动权交给用户了
这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统的耦合性大大降低~,可以更加专注的在业务的实现上!这是IOC的原型!
3、IOC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
4、Spring 入门程序
4-1.实体类
public class User
private String name;
public String getName()
return name;
public void setName(String name)
this.name = name;
@Override
public String toString()
return "User" +
"name='" + name + '\\'' +
'';
4-2.配置文件
<?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">
<!--使用Spring 来创建对象,在Spring 中,这些都称为bean
类型 变量名 = new 类型();
User user = new User();
bean = 对象 new User();
id = 变量名
class = new 的对象;
property 相当于 给对象中的属性设置一个值!
-->
<bean id="user" class="cn.bloghut.domain.User">
<property name="name" value="csdn_闲言"/>
</bean>
</beans>
4-3.测试
public static void main(String[] args)
//获取Spring 的上下文对象
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
//我们的对象现在都在Spring 中管理了,我们要使用,直接去里面取出来就行了
User user = (User)ac.getBean("user");
//打印
System.out.println(user.toString());
4-4.结果
Username='闲言'
4-5.思考问题?
Hello对象是谁创建的?
Hello对象是由Spring创建的。
Hello对象的属性是怎么设置的?
Hello对象的属性是由Spring容器设置的。
这个过程就叫控制反转:
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。
反转:程序本身不创建对象,而变成被动的接收对象。
依赖注入:就是利用set方法来进行注入的。
IOC是一种编程思想,由主动的编程变成被动的接收。
可以通过new ClassPathXmlApplicationContext去浏览一下底层源码。
到了现在,不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IOC,一句话搞定:对象由Spring来创建,管理,装配!
5、IOC创建对象的方式
5-1.使用无参构造创建对象,默认!
public User()
System.out.println("User 空参构造方法执行了");
<!--注入user-->
<bean id="user" class="cn.bloghut.pojo.User">
<property name="name" value="csdn_闲言"/>
</bean>
5-2.使用有参构造创建对象
下标赋值
public User(String name)
this.name = name;
<bean id="user" class="cn.bloghut.pojo.User">
<constructor-arg index="0" value="csdn_闲言"/>
</bean>
5-3.类型
public User(String name)
this.name = name;
<!--通过类型-->
<bean id="user" class="cn.bloghut.pojo.User">
<constructor-arg type="java.lang.String" value="csdn_闲言"/>
</bean>
参数名
<!--参数名-->
<bean id="user" class="cn.bloghut.pojo.User">
<constructor-arg name="name" value="csnd_闲言"/>
</bean>
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!
Spring 容器,就类似于婚介网站。
- 信息都注册在里面
- 你想查看(获取)的时候再拿
6、Spring配置
6-1.别名
<bean id="user" class="cn.bloghut.pojo.User">
<constructor-arg name="name" value="csnd_闲言"/>
</bean>
<alias name="user" alias="user2"/>
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
User user = (User)ac.getBean("user2");
user.show();
输出:csnd_闲言
6-2.Bean的配置
别名可以通过很多种方式分割
空格分割
逗号分割
分号分割
<bean id="user" class="cn.bloghut.pojo.User" name="user2 u2,u3;u4">
<property name="name" value="csdn_闲言"/>
</bean>
// User user = (User)ac.getBean("user");
// User user = (User)ac.getBean("user2");
// User user = (User)ac.getBean("u2");
// User user = (User)ac.getBean("u3");
User user = (User)ac.getBean("u4");
user.show();
输出:csdn_闲言
6-3.import
这个import。一般用于团队开发使用,它可以将多个配置文件,导入合并为一个。
假设,现在项目中有多个人开发,这三个人负责不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!
- 张三
- 李四
- 王五
使用的时候,直接使用总的配置就可以了。
7、依赖注入
7-1.构造器注入
略
7-2.Set 注入
依赖:bean对象的创建依赖于容器!
注入:bean对象中的所有属性,由容器来注入!
Address类
public class Address
private String address;
省略setter
student类
public class Student
private String name;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String,String> card;
private Set<String> games;
private String wife;
private Properties info;
省略setter
bean.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">
<bean id="address" class="cn.bloghut.domain.Address">
<property name="address" value="csdn_闲言"/>
</bean>
<bean id="student" class="cn.bloghut.domain.Student">
<!--注入address 类型-->
<property name="address" ref="address"/>
<!--String 类型-->
<property name="name" value="csdn_闲言"/>
<!--String 类型-->
<property name="books">
<array>
<value>JavaSE</value>
<value>JavaWeb</value>
<value>Spring</value>
<value>SpringMVC</value>
<value>Mybatis</value>
</array>
</property>
<!--List-->
<property name="hobbies">
<list>
<value>唱</value>
<value>跳</value>
<value>rap</value>
<value>篮球</value>
</list>
</property>
<!--Map-->
<property name="card">
<map>
<entry key="闲言" value="csdn——闲言"></entry>
<entry key="闲言博客" value="csdn——闲言——博客"></entry>
</map>
</property>
<!--set-->
<property name="games">
<set>
<value>唱</value>
<value>跳</value>
<value>rap</value>
<value>篮球</value>
</set>
</property>
<!--String-->
<property name="wife" value="xxx"></property>
<!--Properties-->
<property name="info">
<props>
<prop key="p1">v1</prop>
<prop key="p2">v2</prop>
<prop key="p3">v3</prop>
</props>
</property>
</bean>
</beans>
测试
public static void main(String[] args)
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
Student student = (Student)ac.getBean("student");
System.out.println(student);
输出
Student
name='csdn_闲言',
address=Addressaddress='csdn_闲言',
books=[JavaSE, JavaWeb, Spring, SpringMVC, Mybatis],
hobbies=[唱, 跳, rap, 篮球],
card=闲言=csdn——闲言, 闲言博客=csdn——闲言——博客,
games=[唱, 跳, rap, 篮球],
wife='xxx',
info=p3=v3, p2=v2, p1=v1
## 8、拓展方式注入 可以使用**p命名空间**和**c命名空间**进行注入
- p 命名空间对应 setter 方式注入(要提供set方法)
- c 命令空间对应 构造方法 (要提供有参构造方法)
<?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:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-bea以上是关于狂神说JavaSpring详解的主要内容,如果未能解决你的问题,请参考以下文章
狂神说JavaJavaWeb入门到实战--Servlet详解