主要内容
1.Spring框架的简介
2.Spring的环境搭建和IOC引入
3.创建Bean对象的方式
4.DI的使用
5.DI的实现的三种方式
一.Spring框架的简介
1.为什么使用Spring框架
问题:
[1]使用mybatis结合servlet的使用的时候,书写的代码业务层相对比较的麻烦
[2]目前书写的代码层和层之间的耦合性比较高
[3]目前书写的代码后期的扩展性比较低
2.解决方案
使用Spring解决 Spring是解决了业务层和其他各层之间的耦合(高内聚,低耦合)
3.Spring框架简介
A.Spring,春天.Spring框架在开发中的角色是用于管理其他的框架和对象.换句话说,Spring可以使已有的技术更好用.
B.Spring之父.Rod Johnson
C.轮子理论,不要重复发明轮子
D.关于版本.在spring3之前,spring只提供一个jar,spring.jar;从spring3之后,官方对spring做了拆分,分成了多个jar包(spring-aop,spring-beans,spring-context,spring-expression,spring-core,spring-jdbc,spring-tx,spring-web,spring-webmvc等)
E.Jar包和源码的下载地址
http://github.com/spring-projects/spring-framework/tags
https://repo.spring.io/libs-release-local/org/springframework/spring/
F.学习Spring的主要内容:
a)IOC/DI:控制反正/依赖注入
b)AOP:面向切面编程
c)TX:声明式事务
4.介绍Spring Framework Runtime

A.Test
对应spring-test.jar.Spring提供的测试工具,可以整合Junit测试,简化测试环节
B.Core Container
Spring的核心组件,包含了Spring框架最基本的支撑
Beans,对应spring-beans.jar.Spring进行对象管理时依赖的jar包
Core,对应spring-core.jar,Spring核心jar包
Context,对应spring-context.jar,Spring容器上下文对象
SpEL,对应spring-expression.jar,Spring表达式语言
C.AOP
面向切面编程,对应spring-aop.jar
D.Data Access
Spring对数据访问层的封装
JDBC,对应spring-jdbc.jar.Spring对jdbc的封装,当需要使用spring连接数据库时使用.spring-jdbc.jar需要依赖spring-tx.jar
Transactions,对应spring-tx.jar.事务管理
ORM,对应spring-orm.jar.spring整合第三方orm框架需要使用的jar包,例如Hibernate框架
E.Web
Spring对javax下的接口或类做的扩展功能.
spring-web.jar,对Servlet,filter,Listener等做的增强.
spring-webmvc.jar,实际上就是SpringMVC框架,需要一阿里spring环境和spring-web.jar
二.搭建Spring基础环境
1.责任链
我们在使用MVC进行开发的时候数据在各层之间进行传递,数据传递的时候在业务上形成一个链条,这个链条称之为责任链
2.基于责任链模式开发的缺点:
层和层之间的相互调用造成了耦合性比较高
3.解决方案
Spring IOC:控制反转
Inversion of Control
作用:帮助我们创建对象的

4.代码实现步骤
A/创建项目并导包
创建java工程,导入jar包
spring核心jar包:4个
日志包:commons-logging.jar,被spring-core.jar所依赖.
B.提供配置文件
配置文件要求是一个xml文件.命名没有要求,位置没有要求.一般这个文件会放在src下,命名为applicationContext.xml
<?xml version="1.0" encoding="UTF-8">
<!--
xmlns:xml namespace,当前配置文件默认使用哪个命名空间
xmlns:xsi xml schema instance,schena 约束规范的提供者
xsi:schemaLocation schema约束文件的地址,值的表示方式为:key:value
key是一个标识
value是xsd文件的url地址
-->
<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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--Spring管理User对象-->
<bean class="com.bjsxt.pojo.User" id="user"/>
</beans>
C.编写测试代码
public class TestSpring{
public static void main(String[] args){
//Ctrl+h:Hierarchy面板,层级展示当前类(接口)的结构
//Ctrl+Alt+b:查看当前接口下的所有子接口和实现类
//加载Spring配置文件,得到Spring容器对象
ApplicationContext context =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//从容器中获取需要的对象
Useruser= context.getBean("user",User.class);
System.out.println(user);
User user2 = context.getBean("user",User.class);
System.out.println(user==user2);//true
}
}
5.总结
A.IOC实现的好处
实现代码之间的解耦
B.IOC:控制反转
控制:创建对象的过程
反转:创建对象的操作本身是程序员自己完成的,现在反交给Spring进行创建
三.Spring创建对象的几种方式
1.通过构造器创建对象
无参构造器.默认Spring会使用无参构造器创建对象
2.有参构造器
可以在<bean>下通过<constructor-arg>标签指定使用有参构造器创建对象.属性介绍:
index:索引,从0开始,表示参数的索引位置
name:名称,表示参数的名称
type:类型,表示参数的类型
value:赋值,当值是简单类型时可以使用.基本类型,包装类型,String,resource,class
ref:(reference)赋值.当值为非常简单类型时使用,表示需要应用一个<bean>
<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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--Spring管理User对象-->
<bean class="com.bjsxt.pojo.User" id="user">
<constructor-arg name="id" index="0" type="java.lang.Integer" value="123"/>
<constructor-arg name="name" index="1" type="java.lang.String" value="张无忌"/>
</bean>
</beans>
3.通过工厂创建对象
[1]实例对象.需要先创建工厂对象,然后调用指定的方法创阿金目标对象
<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"
http://www.springframework.org/schema/beans/spring-beans.xsd>
<!--创建工厂对象-->
<bean id="factory" class="com.bjsxt.factory.UserFactory1"/>
<!--通过实例工厂创建目标对象-->
<beans id="user" factory-bean="factory" factory-method="getInstance">
</beans>
[2]静态工厂,直接通过工厂类调用静态方法就可以创建目标对象
<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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--通过静态工厂创建目标对象-->
<bean id="user" class="com.bjsxt.factory.UserFactory2" factory-method="getInstance"/>
</beans>
第四节 DI依赖注入
1.为什么使用DI9(依赖注入)
作用:给对象中的全局属性或者对象进行赋值的操作
2.利用DI进行解决
1.英文全称(Dependency Injection)
2.中文名称:依赖注入
2.1依赖:一个类在另一个类中作为全局属性时
2.2注入:通过外部给自己属性(或其他内容)进行赋值
3.类与类之间的关系:
3.1继承 实现 依赖 关联 聚合 组合
3.2 关系强度:组合>聚合>关联>依赖
4.DI的意义
解除类与类之间高耦合性,给对象中全局对象赋值的操作
Spring帮助创建对象的过程叫做IOC,创建对象是给对象中全局对象赋值叫做DI,所以认为IOC和DI是同一个事情.
五.依赖注入的几种方式
1.有参构造
<!--[A]使用有参构造器进行值的注入-->
<!--value和ref的使用场景
如果给基本数据类型+String注入值的时候使用value
如果给对象注入值的时候 使用ref
-->
<bean id>
<constructor-arg name="cno" value="1"></sonstructor-arg>
<constructor-arg name="cname" value="s106java"></constructor-arg>
</bean>
<bean id="stu" class="com.bjsxt.spring01.Student">
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="name" value="zs"></constructor-arg>
<constructor-arg name="sex" value="男"></constructor-arg>
<constructor-arg name="clazz" ref="cla"></constructor-arg>
</bean>
2.SET方法
<!--[B]使用set方法进行值的注入-->
<bean id="stu" class="com.bjsxt.spring01.Student">
<property name="sex" vlaue="男"></property>
<property name="age" value="18"></property>
<property name="name" value="zs"></property>
<property name="clazz" ref="cla"></property>
</bean>
3.设置值自动注入
<!--[C]自动注入
autowire的可选择值
*底层调用的都是set方法
byName:查找方式 整个配置文件中查询[bean标签的ID名称]和[注入实体类中的属性名]一致的话,就完成自动注入
byType:查找方式 整个配置文件中查询[bean标签类型]和[注入实体类中的属性类型]一致的话,就完成自动注入
*底层走的是构造器
constructor:收钱根据bean标签的ID名称进行匹配,如果没有对应的值,再根据bean的类型进行匹配
-->
<bean id="stu" class="com.bjsxt.spring01.Student" autowire="constructor"></bean>
4.其他值注入
public class User{
private String[] arr;
private List<String> list;
private Set<String> set;
private Map<String,String>map;
}
<!--特殊值的注入-->
<bean id="user" class="com.bjsxt.spring02.User">
<!--给数组进行值的注入-->
<property name="arr">
<array>
<value>A</value>
<value>B</value>
<value>C</value>
</array>
</property>
<!--list集合进行值注入-->
<property name="list">
<list>
<value>A</value>
<value>B</value>
<value>C</value>
</list>
</property>
<!--Set集合的赋值-->
<property name="set">
<set>
<value>A</value>
<value>B</value>
<value>C</value>
<value>A</value>
</set>
</property>
<!--Map集合赋值-->
<property name="map">
<map>
<entry>
<key><value>A</vlaue></key>
<value>bjsxt</value>
</entry>
<entry>
<key><value>B</value></key>
<value>bjsxt</value>
</entry>
</map>
</property>
</bean>
网友评论