什么是Spring?
Spring 是分层的Java SE/EE应用轻量级开源框架,以IoC(Inversion of Control控制反转,目的是解耦)和AOP(面向切面编程,本质是动态代理,目的是增强)为内核
Spring的优势:
1、方便解耦,简化开发(IoC思想)
2、AOP编程的支持
3、声明式事务的支持,在xml里面配置事务,在方法上或者类上 打一个注解即可
4、方便程序的测试
5、方便集成各种优秀框架
6、降低JavaEE API的使用难度
7、Java源码是经典学习范例
耦合和内聚:
耦和:代码书写过程中所使用的的技术结合紧密度,用户衡量软件中各个模块的互联程度。
内聚:代码书写过程中单个模块内部各组成部分间的联系,用于衡量软件中各模块内部的功能联系
程序书写的目标:高内聚,低耦合
就是同一个模块中各个元素要高度紧密,但是各个模块间的相互依存度不要那么紧密
控制反转IOC:
- 什么是IOC inversion of control
控制反转,把对象的创建工作交给框架(工厂 Spring),我们不需要自己去new这个对象,只管问工厂要。由原来的主动创建对象,变成自己被动接收 框架创建的对象。
- IOC的作用
IOC是Spring的核心之一,作用就是为了解耦,降低程序,代码间的耦合度。
基础入门:
1、添加依赖:
<!-- 添加spring依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.7.RELEASE</version> </dependency> <!-- 添加junit依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> </dependencies>
2、创建UserService接口
public interface UserService { /** * 添加方法 */ void add(); }
3、创建UserService的实现类
public class UserServiceImpl implements UserService { @Override public void add() { } }
4、在resource下创建applicationContext.xml文件(new->xml configurer-->spring config),创建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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--创建spring控制的资源--> <bean id="us" class="com.itheima.service.impl.UserServiceImpl"/> </beans>
5、在test文件夹下创建测试类
//创建工厂 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //问工厂要对象 UserService us2 = (UserService)context.getBean("us"); //调用对象方法 us2.add(); }
<bean>标签:用于配置,把对象交给spring进行控制,spring会帮助我们创建对象。
注意:spring是调用类的无参构造的创建对象,如果没有无参构造方法,对象不能创建成功。
基本属性:
1、id:唯一表示,不可重复,没有设置id值的情况下,默认以首字母小写的类名作为id值
2、class:bean的权限类名,要写全路径
3、scope:用来定义对象的使用范围,更多的时候是用来定义是单例还是多例对象。
3.1、singleton:表示单例的,一个spring容器里只有一个该bean对象
3.2、prototype:表示多例,一个spring容器里拥有多个该bean对象,每次调用对象都是一个新的对象
- init-method:指定类中初始化方法名称,该方法将在bean对象被创建时执行
- singleton:
1、方法只会调用一次,而且是在创建工厂的时候就调用了;
2、同时也表明了如果托管的类时单列的配置,那么这个类的对象,会在创建工厂的时候,就顺便创建了。
prototype:
1、方法会调用多次,问工厂要多少次对象,就会调用多少次;
2、托管的类时多列配置,那么这个类的对象,会在问工厂要对象的时候才会创建
- destroy-method:指定类中销毁方法名称,该方法将在bean对象被销毁时执行
singleton:
1、如果关闭了工厂,调用close方法,那么工厂关闭时,就会把单列对象也销毁了,顺便调用了destroy方法。
prototype:
2、如果关闭了工厂,那么destroy方法不会调用,因为多例对象不由工厂来管理他们的状态
DI:依赖注入:
应用程序运行依赖的资源有spring为其提供,资源进入应用程序的方式称为注入
三种常见的注入方式:
1、set方法注入:
<property>标签:
作用:使用set方法的形式为bean提供标签
name:对应bean中的属性值,
value:设定非应用类型的对应的值,不能与ref同时使用
ref:设定应用类型对应的值,不能与value同时使用
代码:
1、创建dao接口
public interface UserDao { void add(); }
2、创建dao的实现类
public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("调用了userdaoimpl的add方法"); } }
3、创建service接口
public interface UserService { void add(); }
4、创建service的实现类
private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao=userDao; System.out.println("调用了set方法注入值"); } public void add() { System.out.println("调用了UserServiceImpl。。。。。方法"); userDao.add(); } }
5、创建spring的核心配置文件applicationContext.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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--把UserService交给spring管理--> <bean id="us" class="com.itheima.service.impl.UserServiceImpl"> <!-- 通过property对userDao进行赋值--> <property name="userDao" ref="userDao"></property> </bean> <!--把UserDao交给spring管理--> <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> </beans>
6、编写测试方法
@Test public void TestAdd(){ System.out.println("来调用测试方法了----"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService us =(UserService) context.getBean("us"); us.add(); }
7、打印结果
来调用测试方法了----
调用了set方法注入值
调用了UserServiceImpl。。。。。方法
调用了userdaoimpl的add方法
流程:ioc容器里面已经有了UserDaoImpl的对象,目前UserServiceImpl需要这个对象
那么:1、现在UserServiceImpl里定义一个USerDao类型的属性,
2、提供这个属性的set方法
3、需要xml里面托管UserServiceImpl类的时候,向spring表明,要给我的类里面的UserDao赋值
2、构造器注入
<constructor-arg/>标签:
作用:构造方法专用的为bean赋值的标签,name,value,ref使用方法与property一致
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/> <bean id="us" class="com.itheima.service.impl.UserServiceImpl"> <constructor-arg name="userDao" ref="userDao"/> </bean>
private UserDao userDao; public UserServiceImpl(UserDao userDao){ this.userDao = userDao; }
3、p名称注入
1) 介绍
p名称空间注入,本质仍然是set方法注入
在xml中引入p名称空间的约束
然后通过p:属性名称=""来注入简单数据、使用p:属性名称-ref=""注入其它bean对象,它的本质仍然是set方法注入
<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="" class="" p:属性名="简单值" p:属性名-ref="bean的id"></bean>
</beans>
ApplicationContext的继承体系
- ApplicationContext:接口,代表应用上下文,可以通过其实例对象获取Spring容器中的bean对象
getbean方法介绍:
getbean():通过id,name,class类型来获取对象,id可和name或者class搭配使用,有id不能单独使用name获取