Spring01-IOC
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的更多相关文章
- Spring-01 注解实现IOC
Spring框架四大原则 使用pojo进行轻量级和最小侵入式开发. 通过依赖注入和基于接口编程实现松耦合. 使用AOP和默认习惯进行声明式编程. 使用AOP和模板(template)减少模式化代码. ...
- Spring01——你应该了解的,有关 IOC 容器的一切
从本文开始,将开始介绍关于 Spring 的一些常见知识点.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 Java 相关知识点. 在如今的 Java Web 开发中,Spring ...
- Spring----01. 入门知识,IoC/DI
1.spring两个最基本概念:依赖注入DI.面向切面AOP 2.spring通过上下文Application Context装配bean,实现方式的区别是如何加载它们的配置信息, ClassPath ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- Spring实现Ioc的多种方式--控制反转、依赖注入、xml配置的方式实现IoC、对象作用域
Spring实现Ioc的多种方式 一.IoC基础 1.1.概念: 1.IoC 控制反转(Inversion of Control) IoC是一种设计思想. 2.DI 依赖注入 依赖注入是实现IoC的一 ...
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- 深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
- 自己实现简单Spring Ioc
IoC则是一种 软件设计模式,简单来说Spring通过工厂+反射来实现IoC. 原理简单说明: 其实就是通过解析xml文件,通过反射创建出我们所需要的bean,再将这些bean挨个放到集合中,然后对外 ...
- 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦
1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...
随机推荐
- SQL 模糊查询
在进行数据库查询时,有完整查询和模糊查询之分.一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式:1,%:表示任意0个 ...
- Mybatis分页插件PageHelper正确的使用方法(网上有2篇不够科学的文章)
今天下午在Mybatis项目中,实现分页.因为我是后加入项目中的,Leader用的是PageHelper这个组件,但是我在实际使用的过程中遇到了2个大问题. 1.http://www.oschina. ...
- GoogleNet:inceptionV3论文学习
Rethinking the Inception Architecture for Computer Vision 论文地址:https://arxiv.org/abs/1512.00567 Abst ...
- 迈向angularjs2系列(1):typescript指南
typescript指南 前言 typescript是angularjs2推荐使用的脚本语言.它由微软2012年首次发布. 一. typescript和javascript的区别 1.从遵循的规 ...
- Cognos 11.0快速开发指南 Ⅰ
1. 概述 Cognos Analysics 11,是IBM在Cognos BI 10的版本基础上,吸取业界流行的敏捷BI理念,强化了自助式分析的一款强大BI开发平台工具.其官方文档内容丰富,但是较为 ...
- python 小技巧 防止SSL报错信息
代码里面 只需要添加如下2行: import ssl ssl._create_default_https_context = ssl._create_unverified_context
- 后端路由项目由 gulp 改为 webpack 的踩坑实录
前言 公司有个后端路由的项目是用 gulp 作为前端自动化构建工具,最近学习了一下 webpack,深感其强大,一狠心将其改成了 webpack 构建,以下是踩坑实录. gulp 先来说说原来的架构. ...
- JS实现60s倒计时(亲测有效),及span标签如何使用和禁用onclick事件
效果如下图:点击按钮出现60秒倒计时,60s内按钮不可用,倒计时到了时间方可再次点击获取. 另外还有一个知识点,只有input 及button这样的表单元素有disbale属性,如何设置是否可用属性的 ...
- Linux-使用patch命令给uboot打补丁(3)
patch:修改文件,让用户对原文件打补丁 用法 patch -p[剥离层级] <[补丁文件] 打补丁示例: u-boot-1.1.6_jz2440.patach补丁文件给u-b ...
- 网络编程:基于C语言的简易代理服务器实现(proxylab)
本文记录了一个基于c socket的简易代理服务器的实现.(CS:APP lab 10 proxy lab) 本代理服务器支持keep-alive连接,将访问记录保存在log文件. Github: h ...