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、添加依赖:
org.springframework
spring-context
5.1.7.RELEASE
junit
junit
4.13
test
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的控制资源
5、在test文件夹下创建测试类
//创建工厂
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//问工厂要对象
UserService us2 = (UserService)context.getBean("us");
//调用对象方法
us2.add();
}
注意: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方法注入:作用:使用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
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、构造器注入作用:构造方法专用的为bean赋值的标签,name,value,ref使用方法与property一致
private UserDao userDao;
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
3、p名称注入
1) 介绍
p名称空间注入,本质仍然是set方法注入
在xml中引入p名称空间的约束
然后通过p:属性名称=""来注入简单数据、使用p:属性名称-ref=""注入其它bean对象,它的本质仍然是set方法注入
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">
- ApplicationContext:接口,代表应用上下文,可以通过其实例对象获取Spring容器中的bean对象
getbean():通过id,name,class类型来获取对象,id可和name或者class搭配使用,有id不能单独使用name获取



