spring是什么?
简单来说,spring是一个轻量级的开源的javaEE框架,用来解决企业开发过程中的复杂性。spring有两个核心:IOC和AOP。
IOC:控制反转:把创建对象的过程以及调用的过程交给spring管理。
AOP:面向切面:不修改源代码的情况下进行功能增强。
spring特点:
①:方便解耦,简化开发
②:Aop编程支持
③:方便程序测试
④:方便与其他框架结合
⑤:方便事务操作
⑥:降低API开发的难度
首先我们出创建maven项目,将我们所需要的的包都导进去,也可以直接导webmvc的包,这个包基本包含我们所需要的包。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
初次使用步骤:
①:加载配置文件。
②:获取配置创建的对象。
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
//加载配置文件,这里的传递的参数是相对于src下的路径
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
//获取配置创建的对象,第一个参数是你配置文件中的id值,第二个是你的对象的class
User user = applicationContext.getBean("user", User.class);
user.show();
}
}
配置文件:
IOC容器
什么是IOC
①:控制反转,把对象创建的对象之间的调用过程交给spring管理
②:目的:为了降低耦合度
IOC底层原理:xml解析,工程模式,反射
画图讲解:
IOC接口:
①:IOC是基于IOC容器完成,IOC容器底层就是对象工厂。
②:Spring提供接口:
BeanFactory:IOC容器基本实现,是spring内部基本接口,不提供开发人员使用。(加载配置文件时不会创建对象,只有在使用的时候才会创建对象)
ApplicationContext:BeanFactory接口的子接口,提供更多功能呢,供开发人员使用。(加载配置文件的时候就会创建对象)
IOC操作Bean管理
什么是Bean管理:
Bean管理指的就是两个操作,即spring创建对象,spring注入属性。
Bean管理操作的两种方式
(1):基于xml配置文件方式实现
(2):基于注解方式实现
IOC操作Bean管理(基于xml方式):
1.基于xml方式创建对象
创建对象的时候,默认的是执行无参的构造。
测试代码和上面的一样就不再上图片了
结果:会报红(这里只截取一部分)
基于xml方式注入属性:
(1)DI:依赖注入,就是注入属性
第一种注入方式:通过set方法进行注入。
类中没有set方法
类中有set方法
结果:
第二种注入方式:使用有参构造函数进行注入
配置文件:
user类:
测试类:
第三种注入方式:p名称空间注入(简化注入方式)
在配置文件中写上这么一行:xmlns:p=“http://www.springframework.org/schema/p”
IOC操作Bean管理:
字面量:
(1):允许空值:
给User中的userName赋空值
(2):属性值包含特殊符号
在property标签中对指定的name赋有特殊符号的值,比如书名,带有"《》",一种方法是用 “< ;” "> ;"转义,
第二种方法就是下面的方法在value标签中写上<![CDATA[值]]>
注入属性-IOC注入外部Bean:
配置文件不仅可以配置基本类型,也可以配置引用类型
注入属性-IOC内部Bean注入以及级联赋值
这里只附上配置文件:
XML注入集合属性
测试结果:
如果说要注入引用类型的数据,那么以上的配置文件就会发生改变。这里新新写了一个Address类
抽取集合:
IOC容器-工厂模式
Spring有两种类型Bean,一种是普通Bean,一种是工厂Bean(FactoryBean)
普通Bean:返回值类型与配置文件中的类型一致。
工厂Bean:返回值类型与配置文件中的类型可以不一致。
要想实现工厂Bean,就要让你配置文件中的类实现FactoryBean接口,并重写里面的方法。
IOC-Bean的作用域
作用域:即scope属性,可以通过设置写表示作用域
在默认情况下,创建Bean实例是单实例,即创建多个对象,它们的地址是一样的。
那么如何配置是单实例还是多实例?bean标签中有scope属性来设置实例,scope=“singleton” 单实例 scope=“prototype” 多实例,那么它们有什么区别呢?singleton在配置的时候就会创建对象,prototype在你程序创建对象的时候才会创建对象。
Bean的生命周期
Bean的生命周期实际有7步,在初始化方法的前后各有一步,都是把Bean实例传递给后置处理器的方法。后置处理器有两个方法,一个是在初始化之前执行的方法,一个是在初始化之后执行的方法。要实现后置处理器,首先要创建类来实现BeanPostProcessor接口,然后重写两个方法。
自动装配
什么是自动装配: 根据指定装配规则,Spring自动将匹配的属性值注入。
在bean标签中有autowire属性,它有两个值byName和byType。
byName:通过对象名注入,这就要求你注入的bean值的id要与类属性名一致。
byType:通过属性类型注入,但同属性的对象不能有多个,否则就不会知道找那个对象。
外部属性文件
IOCBean管理注解方式
什么是注解?
注解就是代码的特殊标记。格式:@注解名称(属性名称=属性值,属性名称=属性值…)
目的:简化xml的配置
基于注解方式创建对象
第一步:使用注解需要使用aop的包
第二部:开启组件扫描
<context:component-scan base-package=“com.study” />
第三步:创建类,在类上面写上注解创建对象
@Component(value = “animal”) 这样相当于xml文件中的
基于注解方式实现属性注入
- @Autowired
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component(value = "animal")
@Scope(value = "singleton")
public class Animal {
@Value("狗")
private String name;
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(2)@Qualifier(和AutoWired一起使用)
(3)@Resource
(4)@Value(注入普通属性)
完全注解开发
使用完全注解开发避免了使用xml进行配置,但是较为复杂的情况还要使用xml进行配置
//config类
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.study")
public class AnnoConfig {
}
//Test类import com.study.config.AnnoConfig;
import com.study.dao.AnimalDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AnnoConfig.class);
AnimalDao animalDao = context.getBean("animalDao", AnimalDao.class);
animalDao.showInof();
}
}
//AnimalDao类
import com.study.pojo.Animal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
@Repository(value = "animalDao")
public class AnimalDao {
@Autowired
@Qualifier(value = "animal")//value指向Animal类上的Component注解的values值
private Animal animal;
public void showInof(){
System.out.println(animal.getName()+"###########");
}
}
//Animal类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component(value = "animal")
@Scope(value = "singleton")
//也可以通过Import注解将别的配置类导入进来
@Import(value = {Config1.class,Config2.class})
public class Animal {
@Value("狗")
private String name;
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}