1.Spring基本功能详解

    1. SpringIOC Spring的控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。 ``` A. 启动spring容器 1、 在类路径下寻找配置文件来实例化容器 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{“beans.xml”});可以在整个类路径中寻找xml文件
  • 通过这种方式加载。需要将spring的配置文件放到当前项目的classpath路径下
  • classpath路径指的是当前项目的src目录,该目录是java源文件的存放位置。 2、 在文件系统路径下寻找配置文件来实例化容器 ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[]{“d:\beans.xml“});Spring的配置文件可以指定多个,可以通过String数组传入。 注:经常用第一种方法启动容器 B. 从spring容器中提取对象
- 2. 别名

通过这样的配置,可以达到在一个地方命名,在多个地方使用不同的名字的效果。

- 3. 	Spring容器内部对象
  • 1.创建对象的方式
    • 无参构造函数

    <bean id=“personService” class=”cn.itcast.bean.impl.PersonServiceImpl”/>

    • 静态工厂

    public class PersonServiceFactory { public static PersonService createPersonService(){ return new PersonServiceImpl(); } }

    • 实例工厂 记住概念即可
- 4.  singleton(默认值) 
在每个Spring IoC容器中一个bean定义只有一个对象实例(共享)。
默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如:
<beans default-lazy-init="true“ ...> 
-  5. prototype(原型;样机;典型)

允许bean可以被多次实例化(使用一次就创建一个实例) . Spring不能对一个prototype bean的整个生命周期负责.这就意味着清楚prototype作用域的对象并释放任何prototype bean所持有的昂贵资源都是客户端的责任。

-  6. Request

在一次http请求中,一个bean定义对应一个实例,即每次http请求将会有各自的bean实例, 他们依据某个bean定义创建而成.该作用域仅在基于web的Spring ApplicationContext情形下有效

-  7. Session

在一次http请求中,一个bean定义对应一个实例,该作用域仅在基于web的Spring ApplicationContext情形下有效

-  8. Global session

在Global session中,一个bean定义对应一个实例,仅在使用portlet context时有效.该作用域仅在基于web的Spring ApplicationContext情形下有效

-  9. 初始化bean时机

Spring默认在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化的一部分,ApplicationContext会自动创建并配置所有的singleton bean.通常情况下这是件好事。因为这样在配置中有任何错误能立即发现。 Lazy-init=”true or false” Lazy-init 为false,spring容器将在启动的时候报错(比较好的一种方式) Lazy-init 为true,spring容器将在调用该类的时候出错。



-  10. init,destory

Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。 <bean id=“foo” class=“…Foo” init-method=“setup” destory-method=“teardown”/> 当foo被载入到Spring容器中时调用init-method方法。当foo从容器中删除时调用destory-method(scope = singleton有效)

-  11. 依赖注入(DI)
  1. 使用构造器注入 使用xml注入方式 A. 通过参数的顺序 张三 56

    B. 通过参数的类型

    56 张三
  2. 使用属性setting方法进行注入

    使用xml的注入方式:

    A. 简单Bean的注入 简单Bean包括两种类型:包装类型和String

    B. 引用其他Bean

    装配list集合

    list1 list2 </list> </property> 装配set集合 set1 set2 </set> </property> 装配map集合 map01 map02 map中的的数值和以及的一样,可以使任何有效的属性元素,需要注意的是key值必须是String的。 装配properties prop1 prop2
-  12. 注解

步骤: A. 在配置文件中,引入context命名空间

B. 在配置文件中加入context:annotation-config标签 这个配置隐式注册了多个对注释进行解析处理的处理器 AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor 注: @Resource注解在spring安装目录的lib\j2ee\common-annotations.jar 1. @Autowired 这两个注解的区别是:@Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。 2. @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。 3. @Qualifier 如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: 4. @Resource - 1、 @Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上. - 2、 @Resource注解默认按名称装配。 名称可以通过@Resource的name属性指定,如果没有指定name属性, • 当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象 • 当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。 • 注意:如果没有指定name属性,并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 5. @PostConstruct 指定Bean的初始化方法 6. @PreDestory 指定Bean的销毁方法 ``` - 13. 扫描 ``` 前面的例子我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。要使用自动扫描机制,我们需要打开以下配置信息: 1、引入context命名空间 需要在xml配置文件中配置以下信息: 2、在配置文件中添加context:component-scan标签 其中base-package为需要扫描的包(含子包)。 注: 1、在使用组件扫描元素时,AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor会隐式地被包括进来。 也就是说,连个组件都会被自动检测并织入 - 所有这一切都不需要在XML中提供任何bean配置元数据。 2、功能介绍 @Service用于标注业务层组件、 @Controller用于标注控制层组件(如struts中的action)、 @Repository用于标注数据访问组件,即DAO组件。 而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 ``` 14. Spring中的继承 ``` ---