先贴spring的开发文档,有助于大家学习http://shouce.jb51.net/spring/beans.html#beans-factory-class

一直想研究一下spring bean的控制反转的实现,废话不多说。

1、先建了一个WEB工程,导入相关spring的jar包,装载到tomcat上,成功访问,有不懂的童鞋可以移步http://www.cnblogs.com/qing1002/p/6560332.html。

2.为了方便研究,我将对象的调用直接写在controller里,输出相应的日志,如果可以输出,证明bean是创建成功的,代码如下:

package com.controller;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.entity.User;
import com.entity.World;

@Controller
public class SpringServlet {

    /**
     * @Autowired 自动装载world对象 自动按type装载,也就是bean的class属性
     * 或者@Resource(name="world") 按name装载,也就是bean的id
     */
    @Resource(name="world")    //这里的@Resource(name="world")和@Autowired是一模一样的,
    public World world;

    @RequestMapping("/index")
    public String index(Model model){
        world.worldTest();
        return "index";
    }

    @RequestMapping("/save")
    public String Save(@ModelAttribute("form") User user, Model model) { // user:视图层传给控制层的表单对象;model:控制层返回给视图层的对象
        System.out.println(model.toString());
        model.addAttribute("user", user);
        return "detail";
    }
}

3、然后还写了两个类,代码如下:

package com.entity;

import java.io.Serializable;
import java.util.Date;

import org.springframework.stereotype.Repository;

@Repository
public class User implements Serializable{

     private static final long serialVersionUID = 1L;
        private Integer id; // id
        private String name; // name
        private String pwd; // pwd
        private Integer age; // age
//        private Date creatTime; // creatTime

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPwd() {
            return pwd;
        }

        public void setPwd(String pwd) {
            this.pwd = pwd;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

//        public Date getCreatTime() {
//            return creatTime;
//        }
//
//        public void setCreatTime(Date creatTime) {
//            this.creatTime = creatTime;
//        }
        public String toString(){
            return name+"333"+age;
        }
        public void test(){
            System.out.println("22222");
        }
}
package com.entity;

import java.io.Serializable;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;

public class World implements Serializable{

    private static final long serialVersionUID = 1L;

//  @Resource(name="user")   //这里的@Resource(name="user")和@Autowired是一模一样的,
    private User user;

    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public void worldTest(){
        user.test();
        System.out.println("worldTest------" + type+"------"+user.getName());
    }
}

在上述代码中,SpringServlet里的world是IOC容器通过标签@Resource从配置文件中根据name装载的,而World类里同样有一个User类,这个类没有加标签,他是通过setUser()的方法装载的user bean类,配置文件里配置一下bean类,代码如下:

<bean id="world" class="com.entity.World">
        <property name="user" ref="user" />
        <property name="type" value="stringWorld"></property>
    </bean>
    <bean id="user" class="com.entity.User"/>

这样,SpringServlet里的world就通过控制反转的方式生成对象,然后调用world的worldTest()方法,就可以成功输出,如果world对象没有成功生成,调用他的方法的时候会报 java.lang.NullPointerException,

后台日志打印:

证明对象已经成功创建,如果想给对象添加属性,可以直接在配置文件里添加,如下形式:

<bean id="user" class="com.entity.User">
        <property name="id" value="1"></property>
        <property name="name" value="guan"></property>
        <property name="pwd" value="111111"></property>
        <property name="age" value="12"></property>
    </bean>

最后,我想让代码更精简,不想写那么多配置文件,可以采用注解的形式,为World.java的User属性添加@Autowired或者@Resource(name="user")标签,然后改一下配置文件,只需要写两行,如下:

<bean id="world" class="com.entity.World" />
<bean id="user" class="com.entity.User"/>

是不是代码精简了好多,也装逼了好多,程序可以成功运行,同时日志台输出:

然后就结束了,很多东西还有待学习,,,有很多不明白,最后贴一下配置文件springSerblet-config.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
      http://www.springframework.org/schema/util
      http://www.springframework.org/schema/util/spring-util-4.2.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-4.2.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
      http://www.springframework.org/schema/task
      http://www.springframework.org/schema/task/spring-task.xsd ">

    <!-- 使用默认的注解映射 -->
    <mvc:annotation-driven />
    <!-- <mvc:resources location="/" mapping="/index.html" />
      <context:annotation-config></context:annotation-config>-->
    <!-- world bean类 -->
    <bean id="world" class="com.entity.World" />
        <!-- <property name="user" ref="user" />
        <property name="type" value="stringWorld"></property>
    </bean> -->
    <bean id="user" class="com.entity.User"/>
    <!-- user bean类 -->
    <!-- <bean id="user" class="com.entity.User">
        <property name="id" value="1"></property>
        <property name="name" value="guan"></property>
        <property name="pwd" value="111111"></property>
        <property name="age" value="12"></property>
    </bean> -->
    <!-- <bean id="world" class="com.entity.World">
        <property name="user">
            <idref bean="user"/>
        </property>
        <property name="type" value="stringWorld"></property>
    </bean> -->
    <!-- 自动扫描controller包中的控制器 -->
    <context:component-scan base-package="com.controller" />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/index.do">controllerDoem</prop>
            </props>
        </property>
    </bean>

     <bean id="controllerDoem" class="com.controller">
        <property name="view">
            <value>index</value>
        </property>
    </bean>-->

</beans>

applicationContext.xml和web.xml里的是一些web工程基本配置,不要动它,整体结构是这样的:

最后,欢迎各位大神指导,指出错误和不足。。。。   正在努力学习中。。。

spring Bean类自动装载实现的更多相关文章

  1. spring bean autowire自动装配

    转自:http://blog.csdn.net/xiao_jun_0820/article/details/7233139 autowire="byName"会自动装配属性与Bea ...

  2. php类自动装载、链式操作、魔术方法

    1.自动装载实例 目录下有3个文件:index.php load.php tests文件夹 tests文件夹里有 test1.php <?php namespace Tests; class T ...

  3. jdbc操作根据bean类自动组装sql,天啦,我感觉我实现了hibernate

    场景:需要将从ODPS数仓中计算得到的大额可疑交易信息导入到业务系统的mysql中供业务系统审核.最简单的方式是用阿里云的组件自动进行数据同步了.但是本系统是开放是为了产品化,要保证不同环境的可移植性 ...

  4. Spring bean的自动装配属性

    bean的自动装配属性能简化xml文件配置. bean 的自动装配属性分为四种: 1.byName 2.byTyoe 3.constructor 4. autodetect byName: 它查找配置 ...

  5. Spring框架——IOC 自动装载

    IOC自动装载有两种形式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  6. Spring核心技术(八)——Spring自动装载的注解

    本文针对自动装载的一些注解进行描述. 基于注解的容器配置 @Required注解 @Required注解需要应用到Bean的属性的setter方法上面,如下面的例子: public class Sim ...

  7. 解决Spring+Quartz无法自动注入bean问题

    问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...

  8. 8 -- 深入使用Spring -- 2...1 搜索Bean类

    8.2.1 搜索Bean类 既然不再使用Spring配置文件来配置任何Bean实例,那么只能希望Spring会自动搜索某些路径下的Java类,并将这些Java类注册成Bean实例. tips:Rail ...

  9. 【转】Spring Bean属性解析

    转载自:http://wenku.baidu.com/view/30c7672cb4daa58da0114ae2.html Bean所以属性一览: <bean id="beanId&q ...

随机推荐

  1. 推荐几款.NET客户端开源报表图

    如果你正在开发客户端报表图相关的应用,除了.NET自带的控件,你还可以考虑使用以下几个控件库. [OxyPlot] OxyPlot是一个支持.NET的跨平台绘图库.你可以在很多平台上使用它,如WPF, ...

  2. java执行程序的内存分析系列专栏

    近段时间研究了java的程序执行过程中的内存分配,收获颇多,解决了我最近时间学习java的很多困惑点.写java内存分析系列的目的主要有两个,一来是希望给像我一样的java初学者一定的启发,希望也能解 ...

  3. Swift连接字符串和字符

    字符串和字符的值可以通过加法运算符 (+) 相加在一起并创建一个新的字符串值: let string1 = "hello" let string2 = " there&q ...

  4. 再谈AbstractQueuedSynchronizer:基于AbstractQueuedSynchronizer的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...

  5. Jenkins+Ant+TestNG+Testlink自动化构建集成(完整版)

    这段时间折腾自动化测试,之前都是在Eclipse工程里面手工执行自动化测试脚本,调用Testlink API执行测试用例,目前搭建Jenkins自动化构建测试的方式,实现持续构建,执行自动化测试. 硬 ...

  6. ifame高度自动适应子页面内容

    被这个问题折磨了好久,试了很多方法都不行,总算解决了,记录一下. <div class="iframe-pro" id="iframe-proid"> ...

  7. 详解react/redux的服务端渲染:页面性能与SEO

        亟待解决的疑问 为什么服务端渲染首屏渲染快?(对比客户端首屏渲染)   react客户端渲染的一大痛点就是首屏渲染速度慢问题,因为react是一个单页面应用,大多数的资源需要在首次渲染前就加载 ...

  8. SQL语言-----数据操作

    数据操作 增加数据,insert into 标准格式 insert into 表名 (字段的列表)value(数据列表): 使用set insert into 表名 set 字段1=值,2.....: ...

  9. Unity-Shader-镜面高光Phong&BlinnPhong-油腻的师姐在哪里

    [旧博客转移 - 2016年4月4日 13:13 ] 油腻的师姐: 以前玩过一款很火热的端游<剑灵>,剑灵刚出来的时候,某网页游戏广告视频中有句台词:"我不断的在寻找,有你的世界 ...

  10. one plus 1(一加1)刷 kali nethunter 教程

    刚刚入手的一加1,刷成了h2os再进行的本次刷机. 用到以下资源: 链接:http://pan.baidu.com/s/1o7S0xzs 密码:2gvm 好了,开始正题,如果你的系统不是H2OS建议先 ...