spring Bean类自动装载实现
先贴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类自动装载实现的更多相关文章
- spring bean autowire自动装配
转自:http://blog.csdn.net/xiao_jun_0820/article/details/7233139 autowire="byName"会自动装配属性与Bea ...
- php类自动装载、链式操作、魔术方法
1.自动装载实例 目录下有3个文件:index.php load.php tests文件夹 tests文件夹里有 test1.php <?php namespace Tests; class T ...
- jdbc操作根据bean类自动组装sql,天啦,我感觉我实现了hibernate
场景:需要将从ODPS数仓中计算得到的大额可疑交易信息导入到业务系统的mysql中供业务系统审核.最简单的方式是用阿里云的组件自动进行数据同步了.但是本系统是开放是为了产品化,要保证不同环境的可移植性 ...
- Spring bean的自动装配属性
bean的自动装配属性能简化xml文件配置. bean 的自动装配属性分为四种: 1.byName 2.byTyoe 3.constructor 4. autodetect byName: 它查找配置 ...
- Spring框架——IOC 自动装载
IOC自动装载有两种形式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- Spring核心技术(八)——Spring自动装载的注解
本文针对自动装载的一些注解进行描述. 基于注解的容器配置 @Required注解 @Required注解需要应用到Bean的属性的setter方法上面,如下面的例子: public class Sim ...
- 解决Spring+Quartz无法自动注入bean问题
问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...
- 8 -- 深入使用Spring -- 2...1 搜索Bean类
8.2.1 搜索Bean类 既然不再使用Spring配置文件来配置任何Bean实例,那么只能希望Spring会自动搜索某些路径下的Java类,并将这些Java类注册成Bean实例. tips:Rail ...
- 【转】Spring Bean属性解析
转载自:http://wenku.baidu.com/view/30c7672cb4daa58da0114ae2.html Bean所以属性一览: <bean id="beanId&q ...
随机推荐
- 【 js 基础 】Javascript “继承”
是时候写一写 "继承"了,为什么加引号,因为当你阅读完这篇文章,你会知道,说是 继承 其实是不准确的. 一.类1.传统的面向类的语言中的类:类/继承 描述了一种代码的组织结构形式. ...
- java web项目中 读取properties 路径的问题
可以先获取项目的classPath String classPath = this.getClass().getResource("/").getPath();//获取classP ...
- mongodb取出最大值与最小值
$res=self::aggregate([ ['$match'=>[ 'msg_id'=>1007, 'D'=>16, ]], ['$group'=>[ '_id'=> ...
- nodejs模块学习: connect解析
nodejs模块学习: connect解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子来解决 ...
- ES6的十大特性和认知
---恢复内容开始--- ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率.本文主要针对E ...
- Scrapy爬虫实例教程(二)---数据存入MySQL
书接上回 实例教程(一) 本文将详细描述使用scrapy爬去左岸读书所有文章并存入本地MySql数据库中,文中所有操作都是建立在scrapy已经配置完毕,并且系统中已经安装了Mysql数据库(有权限操 ...
- React 实践项目 (二)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- Asp.Net MVC-01-起步
创建第一个MVC程序 我们先创建一个ASP.NET Web程序 模板选择MVC,因为不想使用默认的身份认证我们点击更改身份认证并选择不进行身份认证. 创建的项目结构如下: 配置与初始化 Web配置文件 ...
- 给xcode项目修改名字
在xcode项目开发中,经常会遇到需要修改项目名字的问题, 但是xcode本身修改项目名字比较麻烦,有时候修改的不完全,有时候修改了项目无法打开,无奈只能建一个新项目.这里提供一种修改xcode项目名 ...
- 从零Wordpress建站经验分享,内附耗时间及成本
5月末回国,工作进入空档期. 每天上班没有任务压身,日子过得反而更加难熬. 一直自己做一个网站,却总下不定决心,总是懒得迈出第一步. 正巧朋友需要建设一个宣传用网站. 外面的公司给他报价很高. 反正我 ...