首页 技术 正文
技术 2022年11月21日
0 收藏 760 点赞 3,943 浏览 5963 个字

先贴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。
spring Bean类自动装载实现

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;@Controllerpublic 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;@Repositorypublic 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,
spring Bean类自动装载实现

后台日志打印:

spring 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>

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

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

是不是代码精简了好多,也装逼了好多,程序可以成功运行,同时日志台输出:
spring Bean类自动装载实现

然后就结束了,很多东西还有待学习,,,有很多不明白,最后贴一下配置文件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类自动装载实现

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,028
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,518
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,367
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,146
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,859