文档章节

java框架学习日志-6(bean作用域和自动装配)

 白话
发布于 2018/12/14 23:02
字数 1082
阅读 22
收藏 4

本章补充bean的作用域和自动装配

bean作用域

之前提到可以用scope来设置单例模式

<bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean>

除此之外还有几种用法
singleton:单例模式,Spring默认使用单例模式,也是开发中最常用的类型。即:加载bean配置文件只能生成类的一个实例,只会new一次。
prototype:多例模式,用到一次就会new一次。因为对象多,所以不会销毁。
request:应用在web项目中,Spring创建这个类之后,将这个类存到request范围内。
session:应用在web项目中,Spring创建这个类之后,将这个类存到session范围内。
globalsession:应用在web项目中,必须在portlet环境下才能使用。即在系统下存入数据后,在其子系统下就不需要重新登录。
注意默认情况下bean的作用域是单例。之前我有个疑问,既然是单列,为什么可以在java代码中创建两个实例对象?如下图

        ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
        Student student=(Student)ac.getBean("student");
        Student student1=(Student)ac.getBean("student");

其实这里的getBean获取的bean都是一个bean。我们改student的名字,student1的名字也会改变。因为student在容器里只有一个。

        ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
        Student student=(Student)ac.getBean("student");
        Student student1=(Student)ac.getBean("student");
        student.show();
        student.setName("王五");
        student1.show();


改成prototype

<bean id="student" class="cn.dota2.hero.Student" scope="prototype">
        <property name="name" value="张三"/>
    </bean
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
        Student student=(Student)ac.getBean("student");
        Student student1=(Student)ac.getBean("student");
        student.show();
        student.setName("王五");
        student.show();
        student1.show();

bean自动装配

一个bean文件可能需要引用其他很多bean,这样配置文件可能会很复杂,所有有了自动装配来简化spring。
常规引用

package cq.school.student;

import cq.school.School;

public class Student {
    School school=null;

    public School getSchool() {
        return school;
    }

    public void setSchool(School school) {
        this.school = school;
    }
    public void show(){
        school.getSchool();
    }
}

bean配置

    <bean id="frist" class="cq.school.FristSchool"/>
    <bean id="second" class="cq.school.SecondSchool"/>
    <bean id="student" class="cq.school.student.Student">
        <property name="school" ref="frist"/>

自动装配有几种种

通过byname自动装配。

<bean id="student" class="cq.school.student.Student" autowire="byName">

这里的name是Student中的setSchoole中的school。它会在bean容器中寻找name相符合的自动装配。所以需要更改frist或者second的id或者name。代码如下

    <bean id="school" class="cq.school.SecondSchool"/>
    <bean id="student" class="cq.school.student.Student" autowire="byName">


java代码中给school赋值的方法时setSchool,所以会把id为school传给student。

通过byType装配。

    <bean  class="cq.school.FristSchool"/>
    <bean  class="cq.school.SecondSchool"/>
    <bean id="student" class="cq.school.student.Student" autowire="byType"/>

和byname相似,会自动寻找类型相符合的装配,测试一下
报错原因是因为一中和二中都是符合类型的,要删除一个才行,用bytpye装配需要整个容器只有一个相符合的类型。删除一个后

    <bean  class="cq.school.SecondSchool"/>
    <bean id="student" class="cq.school.student.Student" autowire="byType"/>


如果所有配置都需要用到一种配置方式,可以在头文件中加入default-autowire="byName"。或者换成其他配置方法

<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-2.5.xsd" default-autowire="byName">

consrtuctor注入。

通过构造器注入。适用于bytype得而方式装配构造器,修改一下student的代码,去掉set方法,让它在构造方法里面设置school。

package cq.school.student;

import cq.school.School;

public class Student {
    School school=null;
    public Student(School school){//修改处
        this.school=school;
    }

    public School getSchool() {
        return school;
    }

    public void show(){
        school.getSchool();
    }
}

自动装配改成改成constructor注入

<?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-2.5.xsd" default-autowire="byName">
    <bean  class="cq.school.SecondSchool"/>
    <bean id="student" class="cq.school.student.Student" autowire="constructor"/>
</beans>

结果一样。

总结

在配置bean时,有 scope属性,可以配置bean作用域,在整合struts2和spring时,需要将action设为scope=“prototype”;(目前不知道为啥,反正记住),关于自动装配,用于减少配置文件。我自己感觉自动装配虽然简洁了代码,但是太过简洁反而不利于阅读,特别是bytype装配,bean一旦太多,就容易出bug,而且不好排查。建议少用。

© 著作权归作者所有

共有 人打赏支持
粉丝 7
博文 19
码字总数 21678
作品 0
梁平
私信 提问
细说不懂Spring底层原理带来的伤与痛

什么是spring? Spring 是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为...

老道士
2018/09/04
0
0
[转载]69道Spring面试题和答案

原文地址 http://ifeve.com/spring-interview-questions-and-answers/ 目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概......

王木东
2017/03/27
0
0
Spring面试题(70道,史上最全)

1.什么是spring? 2.使用Spring框架的好处是什么? 3.Spring由哪些模块组成? 4.核心容器(应用上下文)模块。 5.BeanFactory–BeanFactory实现举例。 6.XMLBeanFactory 7.解释AOP模块 8.解释J...

java技术栈
2017/11/08
0
0
更新整理本人所有博文中提供的代码与工具(Java,2014.01)

  为了更方便地管理博文中涉及的各种代码与工具资源,现在把这些资源迁移到 Google Code 中,有兴趣者可前往下载。 Java 1、《高效 Java Web 应用开发框架 JessMA v3.3.1 正式发布》   摘...

伤神小怪兽
2014/01/08
569
3
【★更新★】整理发布本人所有开源代码、工具及相关博文(Java)

  为了更方便地管理博文中涉及的各种代码与工具资源,现在把这些资源迁移到 Google Code 中,有兴趣者可前往下载。 Java 1、《【五一呈献】Java 全能高效 MVC & REST 开发框架 Portal-Bas...

伤神小怪兽
2013/05/13
1K
12

没有更多内容

加载失败,请刷新页面

加载更多

【转】初次提交项目到github

第一步:安装Git 第二步:在自己的工程目录下右键鼠标 选择 Git Bash Here 执行命令 git init 来创建一个本地代码仓库 执行命令 git add . 来把所有文件添加到仓库 执行命令 git commit -m ...

覃光林
14分钟前
2
0
Zend Studio使用教程:使用PHPUnit检测代码(五)

本教程演示如何在代码上创建和运行PHPUnit Test。您将学习如何创建和运行包含许多测试用例的单个单元测试用例和测试套件。 单元测试是一个测试代码的过程,以确保源代码的各个单元正常工作,...

电池盒
14分钟前
2
0
前端 联想搜索下拉框

data.result 为联想搜索出来的数组 innerhtml += "<ul style='list-style:none;font-size:13px;margin: 0px;padding: 5px;'>";for (var j = 0; j < data.result.length; j++) { var r......

yan_liu
14分钟前
2
0
预计2019年发布的Vue3.0到底有什么不一样的地方?

摘要: Vue 3.0预览。 原文:预计今年发布的Vue3.0到底有什么不一样的地方? 作者:小肆 Fundebug经授权转载,版权归原作者所有。 还有几个月距离 vue2 的首次发布就满 3 年了,而 vue 的作者...

Fundebug
14分钟前
1
0
跟我学Spring Cloud(Finchley版)-11-Feign常见问题总结

本文总结Feign常见问题及解决方案。 一、FeignClient接口如使用@PathVariable ,必须指定value属性 代码示例: @FeignClient("microservice-provider-user")public interface UserFeignCli......

周立_ITMuch
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部