一句话总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!
优点:
原来的程序开发的时候,每次当客户的需求发生变化的时候,就需要程序人员改动原来的代码,就存在很大的问题。 问题就是程序适应不了用户需求的变更
控制反转的思想就是让程序适应用户需求的变化,交给用户来选择要调用DAO层的东西
这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。 系统的耦合性大大降低,可以更加专注于业务的实现上,这是IOC的原型!
本质:
控制反转是一种设计思想,DI(依赖注入)是实现IOC的一种方式,在没有IOC的程序中,我们使用面向对象编程,对象的创建于对对象间的依赖关系完全硬编码在程序中,对象的创建有程序自己控制,控制反转后将对象的创建转移给第三方,个人认为控制反转就是:获得依赖对象的方式反转了。
IOC是Spring框架的核心内容,使用多种方式完美的实现了IOC,可以使用xml配置,也可以使用注解,新版本的Spring也可以零配置实现IOC
Spring容器在初始化时线读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象
控制反转时一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的时IOC容器,其实现方式时依赖注入。
1.首先是maven创建项目(quickStart骨架创建),完成相关的包的补全之后,在pom.xml文件下导入相关的依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
部分插件:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2.定义接口和它的实现类,这个是避免不了的用service层调用方法的
接口:
public interface SomeService {
void doSome();
}
实现类:
public class SomeServiceImpl implements SomeService {
@Override
public void doSome() {
System.out.println("====业务方法doSome()===");
}
public SomeServiceImpl() {
super();
System.out.println("SomeServiceImpl无参数构造方法");
}
}
<?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">
<bean id="someservice" class="com.bjpowernode.impl.SomeServiceImpl"></bean>
</beans>
注册bean对象,id:自定义对象的名称,通过id在代码中使用对象,class:类的全限定名称,不能是接口,要是接口的实现类
(我理解是,ioc容器是要借助这一bean标签生成一个对象类来调用接口中规定的方法,实现功能)
有些时候,bean的标签中需要赋值一些属性的:这里是下面要讲的注入的内容
<bean id="mystudent" class="com.bjpowernode.Student">
<property name="age" value="20"/>
<property name="name" value="lisi"/>
<property name="school" ref="myschool"/>
</bean>
<bean id="myschool" class="com.bjpowernode.School">
<property name="name" value="uestc"/>
</bean>
对于一些简单类型的值的赋值,直接用Value即可,对于相关联的对象的,使用ref来赋值,如上所示
4.在配置好applicationContext.xml文件后,便可以进行测试了
public void test02(){
String resource="applicationContext.xml.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(resource);
SomeService service=(SomeService) ac.getBean("someservice");
service.doSome();
}
将Spring的配置文件放在类路径下,用一个字符串给给记录上对应的路径,然后利用ClassPathXmlApplicationContext()方法给创建出来Spring容器,然后使用ApplicationContext(这个对象是Spring容器中的中央调度器,完成对应的bean调度,也和配置文件名称相同,也表示了配置文件配置的就是这么个对象)的getBean方法拿到一个实现类,拿到的是一个object类,要进行强转之后直接调用里面的方法就可以了。
注意:ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。默认是调用的无参构造方法来创建对象,也可以用有参构造的方法来获取对象
以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
2.根据参数类型进行处理(不建议使用,一般碰到相同类型的参数在进行传参的时候就很鸡肋)
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
简单数据类型直接用type中写入就可以,对于引用数据类型,type中写入全限定名称,然后进行ref处理
3.直接通过参数值进行设置
<beans>
<bean id="beanOne" class="x.y.ThingOne">
<constructor-arg ref="beanTwo"/>
<constructor-arg ref="beanThree"/>
</bean>
<bean id="beanTwo" class="x.y.ThingTwo"/>
<bean id="beanThree" class="x.y.ThingThree"/>
</beans>
小结:一种无参构造方法,和三种有参构造方法是IOC容器创建对象的全部方式
上面已经讲过了,就是在bean标签里面使用多种方法,调用该接口实现类的构造器方法就可以实现注入
依赖注入:set注入
要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is
在官网中提供了 许多种情况,分别是包括了字符串、数组、其他等情况
这里面借助狂神说的一篇博客中有一些主要的描述:
https://blog.csdn.net/qq_33369905/article/details/106647271?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166290182716782414923128%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166290182716782414923128&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-8-106647271-null-null.article_score_rank_blog&utm_term=Spring&spm=1018.2226.3001.4450
这篇文章详细描述了set注入的各种情,也可以是看官方文档将对应的情况进行描述
上面讲到了使用xml配置文件来完成对应的javaBean 对象的注册,但在实际的开发中,主要还是使用的注解进行开发,可以直接在程序中使用简单的标签来完成对于bean对象的属性赋值
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 bean 实例。Spring 中使用注解,
需要在原有 Spring 运行环境基础上再做一些改变。
需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解
1.需要导入一些包,在ApplicationContext.xml文件上完成对应的配置,并将组件扫描器component-scan给注册进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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--指定注解扫描包-->
<context:component-scan base-package="com.bjpowernode.dao"/>
</beans>
2.需要在类上面加上注释来完成对于bean的定义,进而可以利用组件扫描器可以查找到,让IOC容器来生成对象
@Component("user")
// 相当于配置文件中
public class User {
public String name = "秦疆";
}
@Component三个衍生注解
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
@Controller:web层
@Service:service层
@Repository:dao层
@Component("user")
// 相当于配置文件中
public class User {
@Value("秦疆")
// 相当于配置文件中
public String name;
}