1,新建一个Java Project 导入如下jar包和apache-commons-logging包

2, 在src目录下创建一个beans.xml的配置文件,先加入schema

spring-beans-3.2.4.RELEASE.jar/org.springframework.beans.factory.xml/spring-beans-version.xsd文件,可以放到本地的dtd目录中,然后引入.

<?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">

<!-- 相当于 HelloWorld hello =new HelloWorld()-->
<bean id="hello" class="com.yangw.spring.model.HelloWorld"></bean>

</beans>

3,创建一个对象HelloWorld

package com.yangw.spring.model;

public class HelloWorld {

    public String hello(){
        return "hello world";
    }
}

4,在beans.xml中创建对象

<!-- 相当于 HelloWorld hello =new HelloWorld()-->
<bean id="hello" class="com.yangw.spring.model.HelloWorld"></bean>

5,创建测试类,完成测试

package com.yangw.spring.test;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.yangw.spring.model.HelloWorld;

public class TestSpring {
    @Test
    public void test01(){

        //创建Spring工厂
        BeanFactory factory= new ClassPathXmlApplicationContext("beans.xml");
        //通过工厂获取Spring的对象
        HelloWorld hello = factory.getBean("hello", HelloWorld.class);// 这个字符串参数是bean.xml中的id
        System.out.println(hello.hello());
    }
}

6, scope属性的用处

<!-- bean标签中有一个属性 scope用来表示范围的 (singleton单例[默认],prototype多例)-->
<bean id="hello" class="com.yangw.spring.model.HelloWorld" ></bean>

7,下面是一个User的action-service-dao的完整过程演示

1)beans.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<!-- bean标签中有一个属性 scope用来表示范围的 (singleton单例[默认],prototype多例)-->

<!-- 将所有的类交给Spring管理,并且对需要注入的完成依赖注入 -->
<bean id="userDao" class="com.yangw.spring.dao.UserDao" />
<bean id="userService" class="com.yangw.spring.service.UserService">
    <!-- name中的值会在userService对象中调用setXXX()方法完成注入 -->
    <property name="userDao" ref="userDao" />
</bean>
<!-- 对于userAction而言,里面的属性值状态会根据不同的线程得到不同的值,因此应该使用多例 -->
<bean id="userAction" class="com.yangw.spring.action.UserAction" scope="prototype">
    <property name="userService" ref="userService" />
</bean>

</beans>

2)User对象

package com.yangw.spring.model;

public class User {

    private int id;
    private String username;

    public User(int id, String username) {

        this.id = id;
        this.username = username;
    }
    public User() {

    }

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + "]";
    }

}

3)UserDao ,接口略去不再这里写了

package com.yangw.spring.dao;

import com.yangw.spring.model.User;

public class UserDao implements IUserDao {

    @Override
    public void add(User user) {

        System.out.println("add :"+user);
    }

    @Override
    public void delete(int id) {

        System.out.println("delete :"+id);
    }

    @Override
    public User load(int id) {
        System.out.println("load :"+id);
        return null;
    }

}

4)UserService

package com.yangw.spring.service;

import com.yangw.spring.dao.IUserDao;
import com.yangw.spring.model.User;

public class UserService implements IUserService {

    private IUserDao userDao ;
    @Override
    public void add(User user) {

        userDao.add(user);
    }

    @Override
    public void delete(int id) {

        userDao.delete(id);
    }

    @Override
    public User load(int id) {

        return    userDao.load(id);

    }

    public IUserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }

}

5)UserAction

package com.yangw.spring.action;

import com.yangw.spring.model.User;
import com.yangw.spring.service.IUserService;

public class UserAction {

    private int id;
    private User user;
    private IUserService userService;

    public void add(){
        userService.add(user);
    }

    public void delete(){
        userService.delete(id);
    }

    public void load(){
        User u=userService.load(id);
        System.out.println(u);
    }

    public int getId() {
        return id;
    }

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

    public User getUser() {
        return user;
    }

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

    public IUserService getUserService() {
        return userService;
    }

    public void setUserService(IUserService userService) {
        this.userService = userService;
    }

}

6)测试

package com.yangw.spring.test;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.yangw.spring.action.UserAction;
import com.yangw.spring.model.HelloWorld;
import com.yangw.spring.model.User;

public class TestSpring {

     //1,创建Spring工厂
    BeanFactory factory= new ClassPathXmlApplicationContext("beans.xml");

    @Test
    public void testUser(){

        //2,通过工厂获取Spring的对象
        UserAction userAction = factory.getBean("userAction", UserAction.class);

        User u1=new User(1,"yangw");
        userAction.setUser(u1);
        userAction.add();
    }
}

8, 一些简单属性的注入使用 value属性而不是ref属性

<bean id="user" class="com.yangw.spring.model.User">
    <!-- 为user设置一些属性值,会调用对象的setXXX()注入值,使用value属性 -->
    <property name="id" value="1" />
    <property name="username" value="tiantian" />
    <!-- 还可以注入list这种列表 -->
    <property name="names">
        <list>
            <value>11111</value>
            <value>22222</value>
            <value>33333</value>
        </list>
    </property>
</bean>
<!-- 对于userAction而言,里面的属性值状态会根据不同的线程得到不同的值,因此应该使用多例 -->
<bean id="userAction" class="com.yangw.spring.action.UserAction" scope="prototype">
    <property name="userService" ref="userService" />
    <property name="user" ref="user"></property>
</bean>

9, 基于annotation的注入

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

   <!--1, 打开Spring的annotation -->
   <context:annotation-config/>
   <!-- 2, 设定Spring去那些包中找annotation -->
    <context:component-scan base-package="com.yangw.spring" />
</beans>
//相当于 <bean id="userDao" class="com.yangw.spring.dao.UserDao"/>
//Component是通用的,一般dao层我们使用
//@Component("userDao")
@Repository("userDao")
public class UserDao implements IUserDao {

}
@Service("userService")
public class UserService implements IUserService {

    @Resource
    //@Autowired 建议使用Resource,Resource默认通过名称注入
    private IUserDao userDao ;
    //其实也可以在set方法上面进行注入    

}
@Controller("userAction")
@Scope("prototype")
public class UserAction {

    private int id;
    private User user;
    @Resource
    private IUserService userService;

}
public class TestSpring2 {

     //1,创建Spring工厂
    BeanFactory factory= new ClassPathXmlApplicationContext("beans2.xml");

    @Test
    public void testUser(){

        //2,通过工厂获取Spring的对象
        UserAction userAction = factory.getBean("userAction", UserAction.class);

        User u1=new User(1,"yangw");
        userAction.setUser(u1);
        userAction.add();
    }
}

Spring01-IOC的更多相关文章

  1. Spring-01 注解实现IOC

    Spring框架四大原则 使用pojo进行轻量级和最小侵入式开发. 通过依赖注入和基于接口编程实现松耦合. 使用AOP和默认习惯进行声明式编程. 使用AOP和模板(template)减少模式化代码. ...

  2. Spring01——你应该了解的,有关 IOC 容器的一切

    从本文开始,将开始介绍关于 Spring 的一些常见知识点.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 Java 相关知识点. 在如今的 Java Web 开发中,Spring ...

  3. Spring----01. 入门知识,IoC/DI

    1.spring两个最基本概念:依赖注入DI.面向切面AOP 2.spring通过上下文Application Context装配bean,实现方式的区别是如何加载它们的配置信息, ClassPath ...

  4. Spring学习总结(一)——Spring实现IoC的多种方式

    控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...

  5. Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域

    Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...

  6. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  7. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  8. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  9. 自己实现简单Spring Ioc

    IoC则是一种 软件设计模式,简单来说Spring通过工厂+反射来实现IoC. 原理简单说明: 其实就是通过解析xml文件,通过反射创建出我们所需要的bean,再将这些bean挨个放到集合中,然后对外 ...

  10. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

随机推荐

  1. Spring中Druid链接池的配置

    本文记录了使用Druid的方法, 包括Spring和Spring boot中使用Druid的配置方法. Spring中配置Druid连接池 以链接mysql为例 1 添加druid依赖 <dep ...

  2. 《NoSQL精粹》读书笔记

    NoSQL数据库数据模型的一般分类: 1. 键值数据模型 2. 文档数据模型 3. 列族数据模型 4. 图数据模型 常见NoSQL数据库: Redis, Cassandra, MongoDB, Neo ...

  3. MySQL Linux压缩版安装方法

    在诸多开源数据库中,MySQL是目前应用行业,特别是互联网行业发展最好的一个.借助灵活的架构特点和适应不同应用系统场景的Storage Engine,MySQL在很多方面已经有不次于传统商用数据库的表 ...

  4. Struts2拦截器配置实例

    拦截器介绍 拦截器 的使用 ,源自Spring AOP(面向切面编程)思想 拦截器 采用 责任链 模式 * 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链. * 责任链每一个节 ...

  5. CSS3笔记之第一天

    通过展示实例来初步学习CSS3 1.背景 设置背景色:background-color:#b0c4de; 设置背景图片:background-image:url('paper.gif'); 设置背景图 ...

  6. 微信JS-API封装接口——node.js版

    github:https://github.com/xjnotxj/wechat_interaction_jsapi Wechat JS-API接口 功能: 用于管理和获取微信 JSSDK 生产的ac ...

  7. ABP从入门到精通(6):快速重命名解决方案

    SolutionRenamer SolutionRenamer 是一个解决方案快速重命名工具.经测试重命名一个全新asp.net zero core项目(ABP asp.net zero,.net c ...

  8. LDMIA、LDMIB、LDMDB、LDMDA、STMIA、LDMFD、LDMFA、LDMED、LDMEA指令详解

    简介: ARM指令中多数据传输共有两种: LDM:(load  much)多数据加载,将地址上的值加载到寄存器上 STM:(store much)多数据存储,将寄存器的值存到地址上 主要用途:现场保护 ...

  9. shell变量$(CURDIR),$0,$1,$2,$#含义解释

    $(CURDIR):   CURDIR是make的内嵌变量, 为当前目录 实例 SRCTREE := $(CURDIR) *$(CURDIR)为当前目录,相当于SRCTREE=./ MKCONFIG ...

  10. 字符串和转为Data类型前后几天

    以防忘记:SimpleDateFormat 可以设置字符串的格式 package com.apploft.util.lang;import java.text.SimpleDateFormat;imp ...