Spring框架学习(第四讲)

来源:互联网 发布:php 中英文混合截取 编辑:程序博客网 时间:2024/05/16 05:35

一、自动装配

在spring中支持自动装配Beans,而且支持5中装配方式。
User.java

package test.com.entitypublic classs User {private Info info ;public User(Info info){    this.info = info;}public void setInfo(){    this.info = info ;}}

Info.java

package test.com.entity;public class Info {private String name;private int age;//......get/set方法省略。}

我们先来看一下在默认的情况下我们通过 ‘ref’ 属性来连接 bean。

<bean id="user" class="com.test.entity.User"><property name="info" ref="info" /></bean><bean id="info" class="com.test.entity.Info" />

接下来我们来看一下其他的几种方式:
Auto-Wiring ‘byName’
按属性名称自动装配。在这种情况下,由于对“info” bean的名称是相同于“user” bean 的属性(“info”)名称,所以,Spring会自动通过setter方法将其装配 – “setInfo(Info info)“.

<bean id="user" class="com.test.entity.User" autowire="byName" /><bean id="person" class="com.test.entity.Person" />

Auto-Wiring ‘byType’
通过按属性的数据类型自动装配Bean。在这种情况下,由于“Info” bean中的数据类型是与“user” bean的属性(Info对象)的数据类型一样的,所以,Spring会自动通过setter方法将其自动装配。– “setInfo(Info info)“.

<bean id="user" class="com.test.entity.User" autowire="byType" /><bean id="person" class="com.test.entity.Person" />

Auto-Wiring ‘constructor’
通过构造函数参数的数据类型按属性自动装配Bean。在这种情况下,由于“info” bean的数据类型与“user” bean的属性(Info对象)的构造函数参数的数据类型是一样的,所以,Spring通过构造方法自动装配 – “public User(Info info)“.

<bean id="user" class="com.test.entity.User" autowire="constructor" /><bean id="info" class="com.test.entity.Info" />

二、自动扫描组件以及注解

现在,启用Spring组件扫描功能。
使用@Component注释来表示这是类是一个自动扫描组件。
将这个“context:component”在bean配置文件,这意味着,在 Spring 中启用自动扫描功能。base-package 是指明存储组件,Spring将扫描该文件夹,并找出Bean(注解为@Component)并注册到 Spring 容器。

<beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-2.5.xsd"><context:component-scan base-package="com.test.service" /></beans>

在Spring2.5中,有4种类型的组件自动扫描注释类型
@Component – 指示自动扫描组件。
@Repository – 表示在持久层DAO组件。
@Service – 表示在业务层服务组件。
@Controller – 表示在表示层控制器组件。
1,使用注解,需要在配置文件中增加命名空间和约束文件

<beans ...  xmlns:context="http://www.springframework.org/schema/context"  xsi:schemaLocation="  ....  http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd  ">  

2,告诉框架那些类是使用注解的。

<context:component-scan base-package="com.test.service" />

3,持久层注解

package com.test.dao;

@Repository
public class UserDao{
//……
}

@Rpository 等同于配置文件中的

<bean id="userDao" class="com.test.UserDao" /> 

4,服务层注解

@Service(value="testService")  public UserService {  @Resource//相当于自动装配  private UserDao userDao ;  public UserDao getUserDao() {               returnuserDao;  }  public void setUserDao(UserDao userDao) {               this.userDao= userDao;  }     }  

@Resource 对象间关系的组合,默认采用的是byName方式进行装配,如果根据名称查找不到关联的对象,那么会再采用byType继续查找。

@Service注解等同与

<bean id="testService" class="com.test.service.UserService" />  

5,控制层注解

@Controller(value="ua")  @Scope(value="prototype")  public class UserAction {       @Resource       private UserService userService ;       public UserService getUserService() {            return userService;       }  }  

@Controller注解等同于

<bean id="ua" class="com.lsz.spring.UserAction " />  

这三个层中的注解关键字都可以使用@Component来代替。
使用注解声明对象,默认情况下生成的id名称为类名称的首字母小写。

6,从Spring环境中获取Action对象

ServletContext application =request.getSession().getServletContext();  ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(application);  UserAction useraction = (UserAction)ac.getBean("ua");//获取控制层对象  response.setContentType("text/html;charset=GBK");//设置编码  PrintWriter out =response.getWriter();  //分别将三个层的对象打印出来。  out.println("Action:"+userAction);  out.println("Service:"+userAction.getUserService());  out.println("Dao:"+userAction.getUserService().getUserDao()); 
0 0
原创粉丝点击