1. 控制反转---- Spring通过一种称作控制反转(IoC Inversion of Control)的技术促进了低耦合, 当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。IOC 把对象的创建交给了 Spring,降低了我们代码类和类之间的耦合度,方便我们对程序进行扩展和维护
2. 面向切面----Spring提供了面向切面(AOP Aspect Oriented Programming)的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transation)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑。在不修改原有代码的基础上增加新的功能,在日志和异常处理方面很常用
**spring注解
(1) spring作用在类上的注解有@Component、@Responsity、@Service以及@Controller;而@Autowired和@Resource是用来修饰字段、构造函数或者设置方法,并做注入的。
(2) 当注解作用在类上时,表明这些类是交给spring容器进行管理的,而当使用@Autowired和@Resource时,表明我需要某个属性、方法或字段,但是并不需要我自己去new一个,只需要使用注解, spring容器会自动的将我需要的属性、方法或对象创造出来。这就是通常所说的依赖注入和控制反转。
3. applicationContext.xml 的配置的一些标签
id:唯一标识,不能重复
name:设置名字,如果有 id 的话可以和别的重复,否则不能
class:类的全名:包名 + 类名
scope:设置创建模式
singleton:单例,只有一个对象,默认的,最常用的(默认)
prototype:多例,每次都是一个新的对象
init-method / destroy-method:在对象创建和销毁的时候调用的方法,
只有在 singleton 下有效,并且方法不能有参数
lazy-init:默认 false 在 bean factories 创建的时候,创建注册过的所有单例类
bean factories 在第一使用 getBean 获取单例对象的时候创建
设置为 true 就是懒加载,只有第一次使用的时候才会去创建对象
autowire:自动把注册过的 bean 关联到当前 bean 对应的属性上
byType:如果注册过的 bean 的类型和属性的类型一致,那么进行赋值操作
这个会实现自动赋值操作
byName:根据注册过的 bean 的名字自动注入属性
4. DI:Dependency Inject 依赖注入 创建对象时动态为属性赋值
两种方式:setter 注入和 构造方法注入,IOC 是 Spring 帮我们创建对象,DI 是 Spring 帮我们为属性赋值
1. 通过 setter 方法进行设置
<property name="name" value="奥迪双钻">
2. 通过构造方法进行设置(index 是参数的索引,从 0 开始 , index 和 type 可以省略)
<constructor-arg name="price" value="200"></constructor-arg>
3. 使用 SpEL 语言赋值:写一些简单的 java 代码
<property name="name" value="#{'bmw'.toUpperCase()}"></property>
<property name="name" value="#{user.name + ' 的汽车'}"></property>
4. p 标签: 需要引入 xmlns:p="http://www.springframework.org/schema/p"
在 bean 标签的属性中使用 p:属性名="" 进行赋值操作
对象赋值需要使用 ref,包括 p 标签也是 p:属性名-ref="bean 的 id"
<property name="owner" ref="user"></property>
5. 集合的赋值
<list></list> ArrayList
<set></set> HashSet
<map> HashMap
<entry>
<key></key>
<value></value>
</entry>
</map>
<props> Properties
<prop key="">value</prop>
<prop key="">value</prop>
</props>
5. 切入点和切入点表达式
切入点:
before:方法执行前,=== 参数校验
after:方法执行后,无论是否产生异常 === 清理资源
after-returing:方法正常执行完毕 === 修改返回值
after-throwing:方法抛出异常 === 包装异常信息
around:方法执行前后两个点
pointcut:切入点表达式
execution(修饰符 返回值 包名.类名.方法名(参数类型))
修饰符:可以省略
返回值:不能省略,可以使用 * 代替
包名:com 不能省,可以使用 * 代替,
中间的包名也可以使用 * 代替,如果想省略需要写 .. 代替
类名,方法名:不能省略,可以使用 * 代替
参数:如果只有一个参数可以使用 * 代替,如果有多个参数可以使用 .. 代替
6. web 项目
在web.xml 中作如下设置
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>