zoukankan      html  css  js  c++  java
  • spring学习(二)配置bean

    Spring可以分为6大模块:

    • Spring Core spring的核心功能: IOC容器, 解决对象创建及依赖关系

    • Spring Web Spring对web模块的支持。

      • 可以与struts整合,让struts的action创建交给spring

      • spring mvc模式

    • Spring DAO Spring 对jdbc操作的支持 【JdbcTemplate模板工具类】

    • Spring ORM spring对orm的支持:

      • 既可以与hibernate整合,【session】

      • 也可以使用spring的对hibernate操作的封装

    • Spring AOP 切面编程

    • SpringEE spring 对javaEE其他模块的支持

    Spring Core 配置bean

    引入jar包,涉及到Spring core的开发jar包有五个

    • commons-logging-1.1.3.jar 日志

    • spring-beans-3.2.5.RELEASE.jar bean节点

    • spring-context-3.2.5.RELEASE.jar spring上下文节点

    • spring-core-3.2.5.RELEASE.jar spring核心功能

    • spring-expression-3.2.5.RELEASE.jar spring表达式相关表

    Spring核心的配置文件applicationContext.xml或者叫bean.xml通过ClassPathXmlApplicationContext来获取ApplicationContext(IOC容器)

    在Spring中可以通过三种方式来配置对象:

    • 使用XML文件配置

    • 使用注解来配置

    • 使用JavaConfig来配置

    使用Xml配置bean

    • 普通带参数的构造方法

        <bean id="user" class="bean.User">
           <!--
           通过constructor这个节点来指定构造函数的参数类型、名称、第几个(index)
           如果构造函数的参数值是一个对象,而不是一个普通类型的值,我们就需要用到ref属性了,而不是value
           -->
           <constructor-arg name="id" type="java.lang.String" value="1"/>
           <constructor-arg name="username" type="java.lang.String" value="tom"/>
       </bean>
    • 工厂静态方法

        <!--工厂静态方法创建对象,直接使用class指向静态类,指定静态方法就行了-->
       <bean id="user" class="bean.Factory" factory-method="getBean"/>
    • 工厂非静态方法:先创建工厂bean,用工厂bean调用非静态方法

    <bean id="factory" class="bean.Factory"/>
    <bean id="user" class="bean.User" factory-bean="factory" factory-method="getBean"/>
    • 构造方法传入集合

    使用注解配置bean

    通过注解来配置信息就是为了简化IOC容器的配置,注解可以把对象添加到IOC容器中、处理对象依赖关系

    使用注解前提步骤:

    • xml配置文件先引入context名称空间

    • 开启注解扫描器

      • 第一种方法:在xml添加

      <context:component-scan base-package="包名"></context:component-scan>
      • 第二种方法:通过自定义扫描类以@CompoentScan修饰来扫描IOC容器的bean对象。在使用@ComponentScan()这个注解的时候,在测试类上需要@ContextConfiguration这个注解来加载配置类,@ContextConfiguration这个注解在Spring的test包下

      //表明该类是配置类
      @Configuration
      //启动扫描器,扫描bb包下的类,也可以指定多个基础包,也可以指定类型
      @ComponentScan("bb")
      public class AnnotationScan {
      }

    创建对象以及处理对象依赖关系,相关的注解:

    • @ComponentScan扫描器

    • @Configuration表明该类是配置类

    • @Component 指定把一个对象加入IOC容器,把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>

    • @Repository 作用同@Component; 在DAO层使用

    • @Service 作用同@Component; 在业务逻辑层使用

    • @Controller 作用同@Component; 在控制层使用

    • @Resource 依赖关系

      • 如果@Resource不指定值name,那么就根据类型来找,相同的类型在IOC容器中不能有两个

      • 如果@Resource指定了值,那么就根据名字来找

    测试代码

    //把对象添加到容器中,首字母会小写
    @Repository
    public class UserDao {
       public void save(){
           System.out.println("db:保存用户");
      }
    }

    //把UserService对象添加到IOC容器中,首字母会小写
    @Service
    public class UserService {
       //如果@Resource不指定值,那么就根据类型来找,如果指定了值,那么Spring就在IOC容器找id为userDao的对象
       @Resource
       private UserDao userDao;
       public void save(){
           userDao.save();
      }
    }

    //把对象添加到IOC容器中,首字母会小写
    @Controller
    public class UserAction {
       @Resource
       private UserService userService;
       public String execute(){
           userService.save();
           return null;
      }
    }

    public class demo1 {
       public static void main(String[] args) {
           ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
           UserAction userAction=(UserAction)ac.getBean("userAction");
           userAction.execute();
      }
    }

    使用JavaConfig配置bean

    由于Spring的自动装配并不能将第三方库组件装配到应用中,于是需要显式装配配置

    通过java代码来配置Bean:

    • 编写一个java类,使用@Configuration修饰该类,被@Configuration修饰的类就是配置类

    • 在配置类中使用@Bean修饰方法,蒋返回值加入到IOC容器中

      • 使用@Bean来修饰方法,该方法返回一个对象。

      • 不管方法体内的对象是怎么创建的,Spring可以获取得到对象就行了。

      • Spring内部会将该对象加入到IOC容器中

      • 容器中bean的ID默认为方法名

    • 在测试类使用@ContextConfiguration加载配置类的信息

    @Configuration
    public class BeanConfiguration {
       @Bean
       public User user(){
           User user=new User();
           System.out.println("我是在configuration中的"+user);
           return user;
      }
    }

    @ContextConfiguration
    public class demo1 {
       public static void main(String[] args) {
           ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
           User user=(User)ac.getBean("user");
           System.out.println(user);
      }
    }

    三种方式混合使用

    注解和XML配置是可以混合使用的,JavaConfig和XML也是可以混合使用的…

    如果JavaConfig的配置类是分散的,我们一般再创建一个更高级的配置类(root),然后使用@Import来将配置类进行组合 如果XML的配置文件是分散的,我们也是创建一个更高级的配置文件(root),然后将配置文件组合

    在JavaConfig引用XML

    • 使用@ImportResource()

    在XML引用JavaConfig

    • 使用<bean>节点就行了

    <bean>节点的属性

    scope属性

    scope的值就只有两个:单例、多例spring默认是单例

    • 当我们使用singleton【单例】的时候,从IOC容器获取的对象都是同一个,默认是单例 【service/dao/工具类】

      • 当使用singleton的时候,对象在IOC容器初始化时创建

    • 当我们使用prototype【多例】的时候,从IOC容器获取的对象都是不同的,【Action对象】

      • 当使用prototype的时候,对象在使用的时候才创建

    lazy-init属性

    lazy-init属性只对singleton【单例】的对象有效,lazy-init默认为false

    有的时候,可能我们**想要对象在使用的时候才创建,那么将lazy-init设置为ture

    init-method和destroy-method

    如果我们想要对象在创建后,执行某个方法,我们指定为init-method属性,对应对象的init_user方法

    如果我们想要IOC容器销毁后,执行某个方法,我们指定destroy-method属性,在调用容器对象的destroy方法时候执行(容器用实现类)

  • 相关阅读:
    转载:Android SQLite数据库版本升级原理解析
    Android可移动的Button
    Android详细目录结构
    自动化测试(二)
    不使用if else
    C# 如何实现自己的FormEditor XML Protocol
    C#中的析构函数,GC和IDisposable的用法
    Java中生成和解析JSON
    GCMS笔记
    Android ConstraintLayout的使用(二)
  • 原文地址:https://www.cnblogs.com/yjh1995/p/14164331.html
Copyright © 2011-2022 走看看