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,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...
随机推荐
- 一步步学习操作系统(1)——参照ucos,在STM32上实现一个简单的多任务(“啰里啰嗦版”)
该篇为“啰里啰嗦版”,另有相应的“精简版”供参考 “不到长城非好汉:不做OS,枉为程序员” OS之于程序员,如同梵蒂冈之于天主教徒,那永远都是块神圣的领土.若今生不能亲历之,实乃憾事! 但是,圣域不是 ...
- perl的正则表达式
“小骆驼”的“正则表达式“部分学习总结: 一.匹配语法: 1.".":任意单字符(‘\n‘除外): 2.“*“:匹配前项0-n次: 3.“+“:匹配前项1-n次: 4.“?”:匹配 ...
- 关于FPU
关于FPU,比较运算有几个地方需要关注,mark一下. he result of the comparison is reported in the condition codes field of ...
- 【Shell Basic】source . 与 bash sh 的区别
一.在命令行窗口执行shell脚本时,source .所执行的脚本中,变量的作用域在当前shell窗口期,而bash.sh在shell脚本执行完了就失效了. dream361@master:~$ ca ...
- fatal error LNK1201:写入程序数据库“***.pdb”时出错;请检查是否是磁盘空间不足、路径无效或权限不够
问题很简单,是因为你的程序正在运行,或者windbg工具在执行dump文件,文件被占用,所以无法写入:
- 中了J.Fla的毒!
中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒!中了J.Fla的毒! ...
- d3.js多个x轴y轴canvas柱状图
最终效果图镇楼: 本文通过三个步骤来介绍d3.js. 1.简单的柱状图: 2.多个x轴的柱状图: 3.多个x轴.y轴的柱状图: 学习心得: d3.js入门相对比较困难,一旦掌握了核心思想,不断熟悉AP ...
- sed武功心法(info sed翻译+注解)
本文中的提到GNU扩展时,表示该功能是GNU为sed提供的(即GNU版本的sed才有该功能),一般此时都会说明:如果要写具有可移植性的脚本,应尽量避免在脚本中使用该选项. 本文中的正则表达式几乎和gr ...
- Jmeter遇到的坑
一.分布式获取不到结果需要改配置文件 在jmeter.properties文件找到mode=Standard去掉# 二.有一个请求要循环查询进度,当进度为100为,跳出循环.这个要怎么操作? ${ ...
- Tomcat Cluster负载均衡
author:JevonWei 版权声明:原创作品 Tomcat Cluster负载均衡 环境 tomcatA 172.16.253.108 tomcatB 172.16.253.105 代理服务器 ...