1: spring框架简介:
1.1:框架背景
多年前web开发过程中遇到的重大问题。基于三层模型开发时,在业务逻辑的代码中能看到很多的手动new对象的代码,如下:这样会造成高度耦合,什么方式才能解决这种问题呢?
1.2 spring框架:
-
非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API
-
控制反转:IOC——Inversion of Control,指的是将对象的创建权交给 Spring 去创建。使用 Spring 之前,对象的创建都是由我们自己在代码中new创建。而使用 Spring 之后。对象的创建都是给了 Spring 框架。
-
依赖注入:DI——Dependency Injection,是指依赖的对象不需要手动调用 setXX 方法去设置,而是通过配置赋值。
-
面向切面编程:Aspect Oriented Programming——AOP
-
容器:Spring 是一个容器,因为它包含并且管理应用对象的生命周期
-
组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。
-
一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上 Spring 自身也提供了表现层的 SpringMVC 和持久层的 Spring JDBC)
1.3 spring框架总结
spring实现了ioc和di原则:
IOC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)是面向对象编程中常用的设计原则和模式,主要用于降低软件组件之间的耦合度。
IOC(控制反转):
IOC是一种设计原则,其核心思想是将对象的创建和管理的控制权从程序代码转移到外部容器或框架。
在传统的程序设计中,我们通常在类中直接创建对象并管理其生命周期。这种方式导致了类之间的紧密耦合,使得代码难以测试、维护和扩展。
IOC通过将对象的创建和依赖关系的管理交由外部容器(如Spring框架)来处理,从而实现了控制权的反转。这样,类不再负责管理其依赖的对象,而是由外部容器负责注入这些依赖。
DI(依赖注入):
DI是实现IOC的一种具体方式,它是指将对象依赖的其他对象(如服务、数据源等)通过外部方式动态地注入到对象中去,而不是在对象内部创建。
通过DI,对象的创建和对象之间的依赖关系被解耦,使得代码更加模块化,易于测试和重用。
DI可以通过构造器注入、设值注入(setter方法)或接口注入等多种方式实现。
总的来说,IOC是一种设计原则,而DI是实现IOC的一种技术。它们共同的目标是提高代码的模块化和可维护性。
2.spring框架实操:
2.1 pom配置文件添加spring组件
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
刷新之后能在maven中看到这些就是成功了
2.2 创建bean配置文件
至此,准备工作就完成了,可以正式开始spring操作
2.3 spring 创建对象
首先随便创建一个类,我取名叫A,在bean配置文件中,使用bean标签给类A添加映射,
class属性是类A的路径,id/name随便取,作为A的唯一标识符
编写测试类:
public class TestMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
A bean = (A) app.getBean("a");
bean.a();
}
}
public class A {
public void a() {
System.out.println("我是a");
}
}
得到的bean就是通过spring创建的对象,能够调用a中的方法
3.使用注解代替bean文件
3.1在bean配置文件中添加注解扫描组件:
<context:component-scan base-package="com.frank"></context:component-scan>
只有添加了这个组件,写的注解才能够被扫描器发现,如果不添加,就会出现找不到bean异常
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'b' available
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:816)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1288)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1109)
at org.example.test2.TestMain.main(TestMain.java:8)
注意:但是如果有注解,也在bean中配置了相应的类,会以bean配置文件中的优先
3.2 各个注解所代替的标签或者属性:
@Component()代替bean标签,括号里面是id/name不写默认为首字母小写的类名 如:类名:User,id名:user
@Scope注解:平替<bean scope="">
@Lazy注解:平替<bean lazy-init="">
@PostConstruct注解:平替<bean init-method="">
@PreDestroy注解:平替<bean destroy-method="">
3.3演示案列:
@Component
public class B {
@PostConstruct
public void init() {
System.out.println("初始化");
}
@PreDestroy
public void destory() {
System.out.println("销毁");
}
}
public static void main(String[] args) {
ClassPathXmlApplicationContext app = new
ClassPathXmlApplicationContext("bean.xml");
B bean = (B) app.getBean("b");
app.close();
}