一,spring
1,spring的优点
(1)方便解耦,简化开发。
(2)AOP编程的支持
(3)声明式事务的支持
(4)方便程序的支持
(5)方便集成各种优秀框架
(6)降低Java EE API的使用难度
(7)Java源码是经典的学习范例。
2,spring的体系结构
(1)IoC
spring核心模块实现了IoC的功能,它将类与类之间的依赖从代码中脱离出来,用配置的方式进行依赖关系描述,由IoC容器负责依赖类之间的创建、拼接、管理、获取等工作。BeanFactory接口是spring框架的核心接口,它实现了容器许多核心的功能。
Context模块构建于核心模块之上,扩展了BeanFactory的功能,添加了i18n国际化、Bean生命周期控制、框架事件体系等功能。
(2)AOP
AOP是进行横切逻辑编程的思想,它开拓了考虑问题的思路。
(3)数据访问与集成
(4)Web及远程操作
(5)Web及远程访问
(6)WebSocket
一,程序的耦合
耦合:程序间的依赖关系
耦合包括:
(1)类之间的依赖
(2)方法见的依赖
解耦:降低程序间的耦合关系
实际开发中:应该做到,编译器不依赖,运行时依赖
解耦的思路:
第一步:使用反射来创建对象,而避免使用new关键字
第二步:通过读取配置文件来获取要创建的对象全限定类名
二,beanfactory
beanfactory:一个创建bean对象的工厂
bean:在计算机英语中,有可重用组件的含义
javabean:用java语言编写的可重用组件。
它就是用于创建service和dao对象的
第一步:需要一个配置文件来配置我们的service和dao
配置的内容:唯一标识 = 全限定类名(key = value)
第二步:通过读取配置文件中配置的内容,反射创建对象
配置文件可以是xml也可以是properties
三,IOC
IOC就是控制反转,控制反转把创建对象的权利交给框架,是框架的重要特征。
四,获取spring的ioc核心容器并根据id获取对象
ApplicationContext的三个常用实现类:
ClassPathXmlApplicationContext 它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。
FileSystemXmlApplicationContext 它可以加载磁盘任意路径下的配置文件(必须有访问权限)
AnnotationConfigAoolicationContext 它是用于读取注解创建容器的。
核心容器的两个接口引发的问题:
ApplicationContext: (单例对象使用)
它在构建容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件就马上创建配置文件的配置对象
BeanFactory: (多例对象使用)
它在创建核心容器时,创建对象采取的策略是延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象
五,把对象的创建交给spring来管理
spring对bean的管理细节
1,创建bean的三种方式
2,bean对象的作用范围
3,bean对象的生命周期
1,创建bean的三种方式
第一种方式:使用默认构造函数创建。
在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。
采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。
<bean id="accountService" class="com.star.service.impl.AccountServiceImpl"></bean>
第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
<bean id="instanceFactory" class="com.star.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
第三种方式:使用工厂中的静态方法创建对象(使用某个类的静态方法创建对象,并存入spring容器)
<bean id="accountService" class="com.star.factory.StaticFactory" factory-method="getAccountService"></bean>
2,bean的作用范围调整
bean标签的scope属性:
作用:用于指定bean的作用范围
取值:
- singleton(单例的 也是默认值)
- prototype(多例的)
- request(作用于web应用的请求范围)
- session(作用于web应用的会话范围)
- global-session(作用于集群环境的会话范围(全局会话范围),当不是集群环境时,他就是session)
六,spring中的依赖注入(Dependency Injection)
IOC的作用: 降低程序之间的耦合
依赖关系的管理:都交给spring来维护
在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
依赖关系的维护:就称之为依赖注入。
依赖注入能注入的数据有三类:
- 基本数据类型和string类
- 其他bean类型(在配置文件中或者注解配置过的bean)
- 复杂类型/集合类型
注入的方式有三种:
- 使用构造函数提供
- 使用set方法提供
- 使用注解提供
七,构造函数的注入
(1)使用的标签:
constructor-arg
(2)标签出现的位置:
bean标签的内部
(3)标签中间的属性:
- type:用于指定要注入的数据的类型,该数据类型也是构造函数中某个或某些参数的类型
- index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值,索引的位置从0开始
- name:用于指定给构造函数中指定名称的参数赋值
以上三个用于指定给构造函数中哪个参数赋值
- value:用于给基本类型或string类型的提供数据
- ref:用于指定其他的bean类型数据。它指的就是在spring的ioc核心容器中出现过的bean对象
(4)优势与弊端
优势:在获取bean对象时,注入数据时必须的操作,否则对象无法创建成功
弊端:改变了对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供
<bean id="accountService" class="com.star.service.impl.AccountServiceImpl" scope="prototype">
<constructor-arg name="name" value="test"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<!--构造一个日期对象-->
<bean id="now" class="java.util.Date"></bean>
八,set方法注入(更为常用)
(1)涉及的标签:
property
(2)出现的位置:
bean标签的内部
(3)标签的属性:
- name:用于指定给构造函数中指定名称的参数赋值
- value:用于给基本类型或string类型的提供数据
- ref:用于指定其他的bean类型数据。它指的就是在spring的ioc核心容器中出现过的bean对象
(4)优势与弊端
优势:创建对象时没有明确的限制,可以直接使用默认的构造函数
弊端:如果有某个成员必须有值,则获取对象时有可能set方法没有执行
(5)复杂类型的注入/集合类型的注入
用于给List结构集合注入的标签:list array set
用于给map结构集合注入的标签:map props
结构相同 标签可以互换
<bean id="accountService2" class="com.star.service.impl.AccountServiceImpl2">
<property name="age" value="19"></property>
<property name="birthday" ref="now"></property>
<property name="name" value="刘星"></property>
</bean>
九,注解
注解的作用就和xml配置文件中编写一个be’an标签实现的功能是一样的
(1)注解的分类
@Component:
作用:用于把当前类对象存入spring容器中
属性:
value:用于指定bean的id,当我们不写时,它的默认值是当前类名,且首字母改小写
@Service 一般用在业务层
@Controler 一般用在表现层
@Repository 一般用在持久层
以上三个注解他们的作用和属性与component是一模一样,他们三个是spring框架为我们提供的明确的三层使用的注解,使我们的三层对象更加清晰
(2)用于注入数据的注解
他们的作用就和xml配置文件中的bean标签中写一个property的作用是一样的
@Autowired:
- 作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
- 如果ioc容器中没有任何bean的类型和要注入的类型匹配,则报错。
- 如果ioc容器中有多个类型匹配时,则根据变量名匹配id,匹配不到则报错
- 出现位置:可以是变量上,也可以是方法上
- 细节:在使用注解注入时,set方法就不是必须的了
@Qualifier:
- 作用:在按照类中注入的基础上再按照名称注入,他在给类成员注入时不能单独使用,但是在给方法参数注入时可以
- 属性:value:用于指定注入bean的id
@Resource
- 作用:直接按照bean的id注入。它可以独立使用
- 属性:name:用于指定bean的id
以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现;
另外,集合类型的注入只能通过xml实现
@Value
- 作用:用于注入基本类型和String类型的数据
- 属性:value:用于指定数据的值。它可以使用spring中的SpEL(也就是spring的el表达式)
(3)用于改变作用范围的注解
他们的作用就和xml配置文件中的bean标签中使用scope属性实现的功能是一样的
@Scope
- 作用:用于指定bean的作用范围
- 属性:value:指定范围的取值。常用取值:singleton prototype
(4) 和生命周期相关的注解
他们的作用就和bean标签中使用init-method和destroy-method的作用是一样的
@PreDestroy
- 作用:用于指定销毁方法
@PostConstruct
- 作用:用于指定初始化方法