Spring框架的复习
一、什么是Spring
spring是一个full-stack(全栈式)轻量级开源框架。主要作用是创建和管理对象,实现解耦,简化开发。
二、Spring的核心
获取对象
在Spring的配置文件中,通过bean节点来实现对象的创建。
- 通过无参构造创建对象
- 通过静态工厂getInstance( )创建对象(少用)
- 通过实例工厂创建对象(少用)
- 通过组件扫面和注解获得组件对象,在后面介绍
由Spring管理的对象的作用域
- 单例:单一的实例,即在同一时刻,某个类的对象是唯一的!scope=“singleton”。
- 懒汉式:默认,需要使用时,才创建。
- 饿汉式:随着容器创建而创建,通过调整lazy-init=“true”。
- 非单例:scope=“prototype”。
对象的生命周期
Spring对象管理的单例对象,存在则生命周期问题,开发者可以在任何自定义的、由Spring管理的类中添加初始化方法和销毁方法,方法必须是void和无参数的,例如:
public class Stduent {
// 初始化方法
public void init() {
System.out.println("Student.init()");
}
// 销毁方法
public void destroy() {
System.out.println("Student.destroy()");
}
}
<bean id="student"
class="cn.tedu.spring.Student"
init-method="init"
destroy-method="destroy">
</bean>
IoC(控制反转)
使用spring框架后,创建对象将由传统的new语法改变为通过Spring容器获取对象,这就是IoC。
其中为了保证获取的对象是有值的,就需要用到DI(依赖注入)。
DI(依赖注入)
依赖注入通常有以下几种方式:
-
1.SET方式注入:为属性注入值时,如果类型是基本型,使用value进行配置,如果类型是引用,需要配置另一个bean来创建值的对象,然后通过ref进行配置。
-
- set方法参数为基本数据类型或String
- set方法参数为基本数据类型或String
-
2.set方法参数为其他应用类型
- 3.set方法参数集合类型时(List , Set , Map , Properties)
<bean id="sampleBean"
class="cn.tedu.spring.SampleBean">
<property name="names">
<list>
<value>Jame</value>
<value>Lucy</value>
<value>David</value>
<value>Tom</value>
<value>Alex</value>
</list>
</property>
</bean>
<property name="cities">
<set>
<value>Hangzhou</value>
<value>Beijing</value>
<value>Shanghai</value>
<value>Shenzhen</value>
<value>Guangzhou</value>
</set>
</property>
<property name="session">
<map>
<entry key="username" value="Jack"/>
<entry key="password" value="1234"/>
<entry key="from" value="Nanjing"/>
</map>
</property>
//此为直接注入
<property name="dbConfig">
<props>
<prop key="name">Jack</prop>
<prop key="age">18</prop>
</props>
</property>
//或者先通过Spring容器扫描相应的properties文件,在进行注入
//如有个db.properties文件,其内容为
url=jdbc:mysql://192.168.0.251:3306/db_name?useUnicode=true&characterEncoding=utf8
driver=com.mysql.jdbc.Driver
username=root
password=root
initialSize=2
maxActive=10
//读取上述文件
<util:properties id="config"
location="classpath:db.properties">
</util:properties>
//注入
<property name="dbConfig"
ref="config">
</property>
2.自动装配
自动装配有多种,一种为byName,还有一种byType
3.(带参)构造方法注入(不常用)
Spring表达式
Spring表达式的基本格式是#{名称},用于表示某个值,甚至,值可以是来自另一个的某个属性!
当某个注入的属性值是通过Spring表达式得到的,则应该配置为value=#{}格式。
关于Spring表达式:
-
如果获取另一个中的某属性值,则使用#{bean-id.属性名};
-
如果获取另一个中的某List集合中的某个值,则使用#{bean-id.List集合名[索引]};
-
如果获取另一个中的某Map集合中的某个值,则使用#{bean-id.Map集合名.key},
还可以是#{bean-id.Map集合名[‘key’]}。
Spring注解(Annotation)
预备工作:开启组件扫描
在Spring的配置文件中添加:
<context:component-scan base-package="cn.tedu.spring.dao" />
组件相关的注解(类前添加)
- @Component :通用组件类
- @Controller :控制器类
- @Service :业务类
- @Repository :数据访问类/持久层处理的类
作用域与生命周期相关的注解
- @Scope(“singleton/prototype”)(类前添加)
- @Lazy(“true/false”)(类前添加)
- @PostConstruct(方法前添加)
- @PreDestroy(方法后添加)
自动装配(属性前添加)
- @Autowired(Spring框架环境)
- @Resource(Java EE环境)
AOP(面向切面编程)
通俗的说,就是指定某些数据处理流程(甚至是所有数据处理流程)都会执行某些方法。
简单的AOP的实现:
@Component
@Aspect
public class TimeElapseAspect {
@Around("execution(* cn.tedu.store.service.impl.*.*(..))")
public Object doAround(
ProceedingJoinPoint pjp)
throws Throwable {
// 在业务方法之前执行的代码
long start = System.currentTimeMillis();
// 执行业务方法,表示执行任何一个应用范围之内的方法
Object obj = pjp.proceed();
// 在业务方法之后执行的代码
long end = System.currentTimeMillis();
System.err.println(
"执行时间:" + (end - start) + "ms.");
// 返回
return obj;
}
}