软件架构技术课堂笔记2
<会存在很多问题,日后的学习会进行更正>
Spring 框架:
Spring是分层的javaEE应用一站式轻量级开源框架,由Rod Johnson创建;Spring是为简了化企业级系统开发而诞生的;使用Spring,可以用简单的JavaBeans来实现那些EJB的功能。
如果一个系统不需要分布式计算或声明式事务支持,EJB并不是最好的选择;Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
Spring的核心是控制反转(IoC)和面向切面编程(AOP)。提供了展现层SpringMVC、持久层SpringJDBC以及业务层是否管理等众多企业级应用技术。Spring IoC和AOP能让代码很好的分层和解耦,从而提高可维护性和可扩展性,便于测试
Spring 模块概述:
核心容器(BeanFactory)
核心容器提供 Spring 框架的基本功能(Spring Core)。
核心容器的主要组件是 BeanFactory ,它是工厂模式的实现,作为IoC容器管理Bean。
BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开,将类和类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述,由IoC容器负责依赖类之间的创建、拼接、管理、获取等工作。 BeanFactory接口是Spring框架的核心接口,实现了容器的许多核心功能。
相关jar包:spring-core.jar,spring-beans.jar
上下文(ApplicationContext):
Spring上下文是一个配置文件,向 Spring框架提供上下文信息。
ApplicationContext是Context模块的核心接口。可用于扫描
相关jar包:spring-context.jar
Spring IoC容器:
BeanFactory是Spring框架最核心接口,BeanFactory使得管理不同类型的Java对象成为可能,应用上下文(ApplicationContext)建立在BeanFactory基础上,提供了更多面向应用的功能。一般称BeanFactory为IoC容器,称ApplicationContext为应用上下文(有时也称为Spring容器)。
从用途上划分,BeanFactory是Spring框架的基础设施。而其子类ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。
创建ApplicationContext对象,代表一个Spring控制反转容器启动。
ApplicationContext的几种常用实现:
- ClassPathXmlApplicationContext:从类路径下的一个或多个XML文件中加载上下文定义,即加载Bean定义的信息。把应用上下文的定义文件作为类资源。(对应的XML名称)
- FileSystemXmlApplicationContext:从文件系统中的一个或多个XMl文件中加载上下文定义,即Bean定义的信息。(绝对路径)
- AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文。
Spring IoC容器启动(实例化)
1 | ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //applicationContext为对应配置文件的名字。子类实现父类接口 |
Spring容器、Bean配置、Bean实现类及应用程序四者关系
- Bean.XML中记录Bean的实现及依赖关系
- Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,根据注册表加载、利用Java语言的反射功能实例化实例化Bean。
- 并建立Bean和Bean的依赖关系。
- 最后将准备就绪的Bean放到Bean缓存池中,供外层应用调用。
- Spring管理的Java对象称为“beans”。
Spring装配Bean前先要创建XML文件。
applicationContext.xml 文件中要有官方给出的bean详细配置
除此之外,这里在用到注解时,也要通过context告知spring容器在创建容器对象时要扫描的包。
Spring的依赖注入DI的具体流程:
- 首先先在service层中建立一个接口叫AccountService
- 在同路径下建立impl (implement类)AccountServiceImpl去实现AccountService接口,并重写AccountService中的方法。
- 在src/com的路径下建立XML配置文件 bean.xml:进行bean的配置信息设置,用于在AccountServiceTest测试类中实现对象的实例化。
代码:1
2
3<bean id="accountService"
class="com.service.impl.AccountServiceImpl">
</bean> - AccountServiceTest中首先先实例化spring容器AccountServiceTest。之后
通过ApplicationContext的getBean方法获取一定名字的bean。通过强转或字节码的形式实例化对象。
代码:1
2ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
AccountService as = ac.getBean("accountService", AccountService.class);
Spring中的依赖注入(DI)可以注入的类型:
1.基本类和String
2.其他bean类型(必须在注解文件中或者注解配置过的bean):
//例如date类型: 用ref将date类的实例注入到accountService中,其他同上节课,value=“要注入的值”
1 | <bean id="accountService1" class="com.service.impl.AccountService_1"> <!--class为类的位置--> |
3.复杂类型(集合类型)
复杂类型注入:
1. 标签:list array set(父集标签:list array set。子集标签:value)
2. map示例:
<property name="myMap">
<map>
<entry key="testA" value="aaa"/>
<entry key="testB">
<value>bbb</value>
</entry>
</map>
</property>
3.Properties示例:
1 | <property name="myProps"> <props> |
- 优势:结构相同的,标签可以进行互换
三种依赖注入方式:
xml:
- 使用构造函数
标签constructor-arg
构造函数注入是除属性注入之外的另一种常用注入方式,他保证一些必要的属性在Bean实例化时就得到设置,并确保Bean实例在实例化后就可以使用。
使用构造函数注入的前提是Bean必须提供带参的构造函数。
- set方法(属性注入):
实际应用中最常采用的注入方式。
通过SetXxx()方法注入Bean的属性值或依赖对象,属性注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供对应的Setter方法。- 涉及的标签:property
- 出现的位置:bean标签内部
- 标签的属性
* name:用于指定注入时所调用的set方法名称 * value:用于提供基本类型和String类型的数据 * ref:用于指定其他bean类型数据
- 寻找类中set方法:
set/get set - 属性名称 :将属性名称的开头字母转换成小写 - 优势:创建对象时没有明确的限制,可直接赋值设置也可以使用默认的构造方法。
- 弊端: 如果有某成员必须有值,则获取对象时可能set方法没有执行。
例子:注意:setXX要与name 一致1
2
3
4
5<bean id ="accountService2" class="com.service.impl.AccountService_2">
<property name="name" value="李四"></property>
<property name="age" value ="20"/>
<property name="birthday" ref="now"/>
</bean>
- 注解:根据提供的注解.
(Component, Controller, Service, Repository)
- 作用:和xml中配置bean作用功能一样
- 属性:value—和bean中id的作用一样,标识作用
- 位置:类上(接口的实现类上) 如下所示:
@Service("accountService")
//@Component("accountService")
public class AccountService_4 implements AccountService{}
用注解的方式时:要在根目录的xml 文件中加入,用于扫描
<!-- 告知spring容器在创建容器对象时要扫描的包 -->
<context:component-scan base-package="com"/>
PS: XML的标签可以是单个<>,也可以有</>配对