Spring框架学习(第四讲)

一、自动装配

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

package test.com.entity

public 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/context
http://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()); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值