我是靠谱客的博主 俊逸菠萝,最近开发中收集的这篇文章主要介绍spring容器和bean的关系,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

         bean 是Spring 管理的基本单位,在Spring 的J2EE应用中,所有的组件都是bean,bean 包括数据源、Hibernate 的SessionFactory 及事务管理器等。任何的Java 对象,Java 组件都可被当成bean 处理。整个应用中各层的对象都处于Spring 的管理下,这些对象以bean 的方式存在。


1:spring容器
 Spring 的容器最基本的接口就是:BeanFactory。BeanFactory 负责配置、创建及管理bean,它有个子接口: ApplictionContext ,因此也被称为Spring 上下文。Spring容器负责管理Bean与Bean之间的依赖关系。Spring负责创建bean 实例,并管理其生命周期

 调用者只需使用getBean 方法即可获得指定bean的引用,无须关心bean 的实例化过程。即bean 实例的创建过程完全透明。


2:bean的基本定义

<beans/> 元素是Spring 配置文件的根元素, <bean> 元素是<beans/> 元素的子元素,<beans/> 元素可以包含多个<bean/>元素, <bean/>子元素定义一个bean ,每个bean 是接受Spring容器里的Java 实例。
        在定义bean时,通常必须指定以下两个属性:
        (1)id: id 属性是确定该bean 的唯一标识符,容器对bean 管理、访问及该bean 的依赖关系,都通过该属性完成。bean 的id 属性在Spring 容器中是唯一的。

        (2)class:class 属性指定该bean 的具体实现类,这里不能是接口。通常情况下,Spring会直接使用new 关键字创建该bean 的实例,因此,这里必须提供bean 实现类的类名。

下面给出包含两个bean定义的简单配置文件:

<!--XML文件的文件头部分,指定了Xml文件的编码值-->
<?xml version = "1.0" encoding = "gb2312"?>
<!--指定Spring的xml配置文件的dtd-->
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<!--beans元素是Spring配置文件的根元素,
所有的Spring的配置文件都应该按以下结构书写-->
<beans>
<!--定义第一个java实例bean1,该java实例对应的实现类是ppp.Test1-->
<bean id="bean1" class = "ppp.Test1"/>
<!--定义第二个java实例bean2,该java实例对应的实现类是ppp.Test2-->
<bean id="bean2" class = "ppp.Test2"/>
</beans>

3:bean的配置

3.1下面基于xml的配置文件来定义了两个简单的bean

<?xml version="1.0" encoding="UTF-8" ?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="car" name="#car1" class="com.baobaotao.simple.Car"></bean>
<bean id="boss" class="com.baobaotao.simple.Boss"></bean>
</beans>

3.1.1属性注入

属性注入即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式。属性注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供对应的Setter方法。Spring先调用Bean的默认构造函数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。

package com.baobaotao.anno;
import org.springframework.beans.factory.BeanNameAware;
public class LogonService implements BeanNameAware{
private LogDao logDao;
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setLogDao(LogDao logDao) {
this.logDao = logDao;
}
public LogDao getLogDao() {
return logDao;
}
public UserDao getUserDao() {
return userDao;
}
public void setBeanName(String beanName) {
System.out.println("beanName:"+beanName);
}
public void initMethod1(){
System.out.println("initMethod1");
}
public void initMethod2(){
System.out.println("initMethod2");
}
}
bean.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-autowire="byName"
>
<bean id="logDao" class="com.baobaotao.anno.LogDao"/>
<bean id="userDao" class="com.baobaotao.anno.UserDao"/>
<bean class="com.baobaotao.anno.LogonService">
<property name="logDao" ref="logDao"></property>
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
3.1.2构造方法注入

使用构造函数注入的前提是Bean必须提供带参数的构造函数。例如

package com.baobaotao.anno;
import org.springframework.beans.factory.BeanNameAware;
public class LogonService implements BeanNameAware{
public LogonService(){}
public LogonService(LogDao logDao, UserDao userDao) {
this.logDao = logDao;
this.userDao = userDao;
}
private LogDao logDao;
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setLogDao(LogDao logDao) {
this.logDao = logDao;
}
public LogDao getLogDao() {
return logDao;
}
public UserDao getUserDao() {
return userDao;
}
public void setBeanName(String beanName) {
System.out.println("beanName:"+beanName);
}
public void initMethod1(){
System.out.println("initMethod1");
}
public void initMethod2(){
System.out.println("initMethod2");
}
}
bean.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-autowire="byName">
<bean id="logDao" class="com.baobaotao.anno.LogDao"/>
<bean id="userDao" class="com.baobaotao.anno.UserDao"/>
<bean class="com.baobaotao.anno.LogonService">
<constructor-arg
ref="logDao"></constructor-arg>
<constructor-arg ref="userDao"></constructor-arg>
</bean>
</beans>

3.2使用注解的方式

Spring容器成功启动的三大要件分别是:Bean定义信息、Bean实现类以及Spring本身。如果采用基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现

下面是使用注解定义一个DAO的Bean:

package com.baobaotao.anno;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
//①通过Repository定义一个DAO的Bean
@Component("userDao")
public class UserDao {
}

在①处,我们使用@Component注解在UserDao类声明处对类进行标注,它可以被Spring容器识别,Spring容器自动将POJO转换为容器管理的Bean。

它和以下的XML配置是等效的((类似于xml文件中定义Bean<bean id=" " class=" "/>

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

Spring通过@Autowired注解实现Bean的依赖注入,下面是一个例子:

package com.baobaotao.anno;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
//① 定义一个Service的Bean(不需要在XML中定义Bean)
@Service
public class LogonService implements BeanNameAware{
//② 分别注入LogDao及UserDao的Bean(不需要在XML中定义property属性注入)
@Autowired(required=false)
private LogDao logDao;
@Autowired
@Qualifier("userDao")
private UserDao userDao;
public LogDao getLogDao() {
return logDao;
}
public UserDao getUserDao() {
return userDao;
}
public void setBeanName(String beanName) {
System.out.println("beanName:"+beanName);
}
public void initMethod1(){
System.out.println("initMethod1");
}
public void initMethod2(){
System.out.println("initMethod2");
}
}

注:让@Resource和@Autowired生效的几种方式

1.在xml配置文件中显式指定
<!-- 为了使用Autowired标签,我们必须在这里配置一个bean的后置处理器 -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
<!-- 为了使用@Resource标签,这里必须配置一个后置处理器 -->
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />

2.在xml配置文件中使用context:annotation-config 
<context:annotation-config />
3.在xml配置文件中使用context:component-scan 
<context:component-scan base-package="com.baobaotao.anno"/>
温馨提示:
<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:
@Controller 声明Action组件
@Service    声明Service组件    @Service("myMovieLister") 
@Repository 声明Dao组件
@Component   泛指组件, 当不好归类时. 
@RequestMapping("/menu")  请求映射
@Resource  用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") 
@Autowired 用于注入,(srping提供的) 默认按类型装配 
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope("prototype")   设定bean的作用域





最后

以上就是俊逸菠萝为你收集整理的spring容器和bean的关系的全部内容,希望文章能够帮你解决spring容器和bean的关系所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部