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方法时候执行(容器用实现类)

原文地址:https://www.cnblogs.com/yjh1995/p/14164331.html