本文共 3912 字,大约阅读时间需要 13 分钟。
本人是个新手,写下博客用于自我复习、自我总结。 如有错误之处,请各位大佬指出。 学习资料来源于:尚硅谷
高度抽取可重用代码的一种设计,有高度的可通用性。
它是多个可重用模块的集合,形成一个某个领域的整体解决方案。Spring: 容器框架,用来简化企业级开发。 核心:IOC 和 AOP
容器:可以管理所有的组件(类)
①非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API
②依赖注入:(IOC)反转控制最经典的实现 ③面向切面编程:AOP ④容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期。 ⑤组件化:Spring实现了使用简单的组件配置组合成一个复杂的应用。在Spring中可以使用XML和Java注解组合这些对象。 ⑥一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。IOC:控制反转
(控制:资源的获取方式) 分为主动式和被动式。主动式:要什么资源自己创建,自己new
BookServlet{ BookService bs=new BookService();}
被动式:资源的获取不是我们自己创建,而是交给一个容器来创建和设置。容器可以自动地探查出那些组件(类)需要用到另一些组件(类);容器帮我们创建对象并赋值过去。
BookServlet{ BookService bs; public void test01{ bs.checkout(); }}
这就是IOC,从主动的new资源变为被动的接受资源。
DI:依赖注入 (IOC的经典实现)
容器能知道哪个组件(类)运行的时候,需要另外一个类(组件);容器通过反射的形式,将容器中准备好的BookService对象注入到BookServlet。 只要容器管理的组件,都能使用容器提供的强大功能。以前是自己new对象,现在所有的对象交给容器创建;给容器注册组件。
1)导包
2)写配置 3)测试需要用哪个模块导哪个包。
模块划分: ①Test:Spirng的单元测试模块 ②Core Container:核心容器(IOC),这部分功能由Beans、Core、Context、SpEL组成 ③AOP ④Aspects AOP+Aspects=面向切面编程模块 ⑤Instrumentation:不常用 ⑥Messaging:不常用 ⑦Data Access/Integration: Data Access:数据库访问模块,用作数据访问,这部分功能由JDBC、ORM、Transactions组成 Integration:集成,这部分功能由OXM、JMS组成,不常用 ⑧Web:开发Web应用模块,这部分功能由WebSocket(新技术)、Servlet(和原生Web相关)、Web(开发Web项目的)、Protlet(开发Web应用的组件集成)组成即核心容器:
spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar commons-logging-1.2.jar Spring运行的时候依赖于一个日志包,没有这个日志包会报错。spring的jar包 按照博文就可以安装成功:https://blog.csdn.net/ethan__xu/article/details/80273249
spring下载commons-logging :http://commons.apache.org/proper/commons-logging/Spring的配置文件中,集合了spring的ioc容器管理的所有组件。
创建一个Spring Bean Configuration File(Spring的bean配置文件)创建之后的文件内容如下:
Person文件如下:
package com.guigu.bean;public class Person { private String lastName; private Integer age; private String gender; private String email; public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "Person [lastName=" + lastName + ", age=" + age + ", gender=" + gender + ", email=" + email + "]"; } }
测试文件如下:
package com.guigu.test;import static org.junit.Assert.*;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.guigu.bean.Person;public class IOCTest { /** * 存在的几个问题: * 1)src,源码包开始的路径,称为类路径的开始; * 所有源码包里面的东西都会被合并放在类路径里面; * java,/bin/ * 2)先导包再创建配置文件 * 3)Spring的容器接管了标志了s的类 * 4)几个细节: * ①ApplicationContext(IOC容器的接口) * 里面的ClassPathXmlApplicationContext("ioc.xml"):ioc容器的配置文件在类路径下; * 里面的FileSystemXmlApplicationContext("F://ioc.xml"):ioc容器的配置文件在磁盘路径下; * ②给容器中注册一个组件,我们也从其中按照id拿到了这个组件的对象。 * 组件的创建工作,是容器完成的。 * Person对象(容器中的对象)是在创建容器完成的时候就已经创建完成了。 * ③同一个组件在ioc容器中是单实例的,而且在容器启动完成之前都已经创建好了。 * ④容器中如果没有这个组件,获取组件就会失败。 * ⑤ioc容器在创建这个组件对象的时候,(property)会利用setter方法为javaBean的属性进行赋值。 * ⑥javaBean的属性名是由getter/setter方法决定的,不是通过private String lastName;决定的 * 即set去掉后面那一串首字母小写就是属性名。 * 所以建议所有的getter和setter都自动生成。 */ /** * 从容器中拿到这个组件 */ @Test public void test() { //ApplicationContext:代表ioc容器 //ClassPathXmlApplicationContext:当前应用的xml配置文件在ClassPath下 //根据spring的配置文件得到ioc容器对象 ApplicationContext ioc=new ClassPathXmlApplicationContext("ioc.xml"); //创建对象是容器做的 Person bean=(Person)ioc.getBean("person01"); System.out.println(bean); }}