Spring入门详细介绍,对新手很友好~~

Spring是什么?

  • Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用于企业应用
  • 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
  • 从大小与开销两方面而言Spring都是轻量级的
  • 通过控制反转(IoC)的技术达到松耦合的目的
  • 提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统服务进行内聚性的开发
  • 包含并管理应用对象的配置和生命周期,这个意义上是一种容器
  • 将简单的自建配置、组合成为复杂的应用,这个意义上是框架

Spring特点:

  • 简单
  • 方便
  • 快捷
  • Spring带来了复杂JavaEE开发的春天

适应范围:

  • 构建企业应用(SpringMVC+Spring+Hibernate/ibatis)
  • 单独使用Bean容器(Bean管理)
  • 单独使用AOP进行切面处理
  • 其他的Spring功能,如:对消息的支持等
  • 在互联网中的应用

什么是框架?

- 维基百科:软件框架,通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件规范时,提供规范所要求之基础功能的软件产品

  • 框架就是制定一套规范或者规则,大家在该规范或者规则下工作.
    框架与类库的区别:
    框架一般是封装了逻辑、高内聚的,类库则是松散的工具组合
    框架专注于某个领域,类库则是更通用

专题一 IOC

什么是IOC?

ioc:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护(例子:需要房子的时候不自己创建,而是找开发商或者房东寻找房源)
DI:(依赖注入)是其一种实现方式
目的:创建对象并且组装对象之间的关系
**注入方式:**构造器注入(构造器类型与Bean类型需对应匹配)和赋值注入

专题二 Bean

Bean的配置项:

  • Id
  • Class
  • Scope
  • Constructor arguments
  • Properties
  • Autowiring mode
  • lazy-initialization mode
  • Initialization/destruction method

Bean的作用域:

  • singleton:单例,指一个Bean容器 中只存在一份
  • prototype:每次请求创建新的实例,destroy方式不生效
  • request:每次http请求创建一个实例且仅在当前request内有效
  • session:同上,每次http请求创建,当前session内有效
  • global session:基于portlet的web中有效,如果是在web中,同session

Bean的生命周期:

  • 定义
  • 初始化
  • 使用
  • 销毁

Aware:

  • Spring中提供部分了一些以Aware结尾的接口,实现了Aware接口的bean在被初始化之后,可以获取相应资源
  • 通过Aware接口,可以对Spring相应资源进行操作(慎重)
  • 为对Spring进行简单的扩展提供了方便的入口

Bean的自动装配(Autowiring)

  • No:不做任何操作
  • byname:柑橘属性名自动装配.此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配
  • byType:如果容器中存在一个与指定属性类型相同的bean,name将与该属性自动装配;如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生
  • Constructor:与byType方式类似,不同之处在于它应用于构造器参数.如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常

Resources(针对于资源文件的统一接口)

  • UrlResource: Url对应的资源,根据一个URL地址即可构建
  • ClassPathResource: 获取类路径下的资源文件
  • FileSystemResource: 获取文件系统里面的资源
  • ServletContextResource: ServletContext封装的资源,用于访问ServletContext环境下的资源
  • InputStreamResource: 针对于输入流封装的资源
  • ByteArrayResource: 针对于字节数组封装的资源
ResourceLoader:用于实现Resources

@Required:

  • @Required注解适用于bean属性的setter方法
  • 这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在bean定义或通过自动装配一个明确的属性值

@Autowired:

  • 可以将@Autowired注解为"传统"的setter方法
  • 可用于构造器或成员变量
  • 默认情况下,如果找不到合适的bean将会导致autowiring失败抛出异常,可以通过下面的方式避免
    @Autowired(required=false)
  • 每个类只能有一个构造器被标记为required=true
  • @Autowired的必要属性,建议使用@Required注解
  • 可以通过添加注解给需要该类型的数组的额字段或方法,以提供ApplicationContext中的所有特定类型的bean
  • 可以用于装配Key为String的Map
  • 如果希望数组有序,可以让bean实现org.springframework.core.Ordered接口或使用的@Order注解
    注意:@Autowired是由Spring BeanPostcessor处理的,所以不能在自己的BeanProcessor或BeanFactoryPostProcessor类型应用这些注解,这些类型必须过XML或者Spring的@Bean注解加载

@Qualifier:

  • 按类型自动装配可能多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数
  • 可用于注解集合类型变量
  • 如果通过名字进行注解注入,主要使用的不是@Autowired(即使在技术上能够通过@Qualifier指定bean的名字),替代方式是使用JSR-250@Resource注解,他是通过其独特的名称来定义识别特定的目标(这是一个与所声明的类型是无关的额匹配过程)
  • 因语义差异,集合或Map类型的bean无法通过@Autowired来注入,因为没有类型匹配到这样的bean,为这些bean使用@Resource注解,通过唯一名称引用集合或Map的bean
  • @Autowired适用于fields,constructors,multi-argumentmethods这些允许在参数级别使用@Qualifier注解缩小范围的情况
  • @Resource适用于成员变量、只有一个参数的setter方法,所以在目标是构造器或一个多参数方法时,最好的方式是用于qualifiers

基于java的容器注解

  • @Bean标识一个用于配置和初始化一个由SpringIoC容器管理的新对象的方法,类似于XML配置文件的
  • 可以在Spring的@Component注解的类中使用@Bean注解任何方法(仅仅是可以)
  • 上一点中,通常使用的是@Configuration注解为配置文件

专题三 AOP

什么是AOP?

  • AOP:Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
  • 主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等

AOP实现方式

  • 预编译----AspectJ
  • 运行期动态代理(JDK动态代理、CGLib动态代理)----SpringAOP、JbossAOP
    1

Spring框架中AOP的用途

  • 提供了声明式的而企业服务,特别是EJB的替代服务的声明
  • 允许用户定制自己的方面,以完成OOP与AOP的互补使用

Spring的AOP实现

  • 纯java实现,无需特殊的编译过程,不需要控制力加载器层次
  • 目前只支持方法执行连接点(通知Spring Bean的方法执行)
  • 不是为了提供最完整的AOP实现(尽管他非常强大);而是侧重于提供一种AOP实现和Spring IoC容器之间的整合,用于帮助解决企业应用中的常见问题
  • Spring AOP不会与AspectJ竞争,从而提供综合全面的AOP解决方案

有接口和无接口的Spring AOP实现区别:

  • Spring AOP默认使用标准的Java SE动态代理作为AOP代理,
  • 这使得任何接口(或者接口集)都可以被代理
  • Spring AOP中也可以使用CGLIB代理(如果一个业务对象并没有实现一个接口 )

Schema ---- based AOP:

Spring所有的切面和通知其都必须放在一个aop:config内(可以配置包含多个aop:config元素),每一个aop:config可以包含pointcut,advisor和aspect元素
(它们必须按照这个顺序进行声明)

猜你喜欢

转载自blog.csdn.net/JavaPorter/article/details/103611169