有一些摘自 JavaCrazyer 大大的...希望不要介意
Spring 介绍;
Spring是一个IoC容器,利用DI技术管理对象之间的依赖!
IoC: Inversion of Control(控制反转)
DI: Dependency Injection(依赖注入)
Spring也是一个对象工厂,它负责生产(即创建)和管理(比如控制它们的生命周期,或给特定的对象创建代理等等)着各种对象
控制反转(IoC)
所谓控制:即获取依赖对象的方式
假如A要调用B的方法(即A依赖于B),则A首先要获得B对象
B b = new BImplement();
A直接依赖于B的具体实现
B b = Factory.getBInstance();
A依赖于工厂对象
上面就是没有“反过来”的情况:A主动获取B对象
反转
即如果A要获取B对象,不是由A主动获取B对象,而是由其它人把B送给A(即将B注入给A),因为A依赖于B,所以B是A的依赖对象,因此称“依赖注入(DI)”
在CMS项目中,我们已经了解了如何通过反射机制,来将某个对象注入到其它对象中!
Spring 配置;
引入spring-framework-3.0.4.RELEASE\dist 下所有的包.再引入一个spring依赖包里. spring依赖包\lib\jakarta-commons 下的 logging的包.
在根目录下写一个beans.xml;
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">
UserActionText.java
public void testAdd() {
BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");
UserAction userAction = (UserAction)factory.getBean("userAction");
userAction.add();}
这是Spring中的工厂接口
下面有众多的实现类
常见的实现类是:ClassPathXmlApplicationContext
-----------------------------------------------------------------------------
scope=singleton
单例
scope=prototype
多例
- singleton:单例,每次getBean从Spring中拿对象都是同一个对象
- prototype:原型,每次getBean从Spring中拿对象都是一个新的对象
------------------------------------------------------------------------------------
Spring IoC的依赖注入
1) 使用构造方法来注入依赖:比较麻烦 一般不使用
2) 使用setter方法来注入依赖:常用 在class上设置set方法.
3) 集合类型的注入
、、
----------------------------------------------------------------------------
UserAction
package cn.com.leadfar;
public class UserAction {
private UserService userSer;
public void add(){
System.out.println("add");
userSer.addUser("1", "2");
}
public void setMyService(UserService us){
this.userSer=us;
}
}
UserService
package cn.com.leadfar;
public class UserService {
private UserDao userDao;
public UserService(UserDao userdao){
this.userDao=userdao;
}
public void addUser(String name,String password){
System.out.println("this is addUser method");
userDao.save();
}
}
UserDao
package cn.com.leadfar;
import java.util.List;
import java.util.Map;
public class UserDao {
private String name;
private int age;
private List lists;
private Map maps;
public void setName(String name) {
this.name = name;
}
public void setLists(List lists) {
this.lists = lists;
}
public void setAge(int age) {
this.age = age;
}
public void save(){
System.out.println("UserDao's method");
System.out.println(name+","+age+","+lists+","+maps);
}
public void setMaps(Map maps) {
this.maps = maps;
}
}
beans.xml
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">
123
456
789
输出结果:
add
this is addUser method
UserDao's method
farewell,5000,[123, 456, 789],{1=i want, 2=catch u, 3=okey, 4=afdadf}
-------------------------------------------------------------------------
Spring中的依赖注入:
- 通过注解(annotation)来注入
- 【注意要使用JDK6】
1、首先,配置文件需要增加
配置,如下所示:
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">
2、将需要管理的各种对象,定义到Spring配置文件中,如:
3、在需要注入的类中,用@Resource注解进行注入:
@Resource
public void setMyService(UserService us){
this.userSer = us;
}
@Resource
public void setHelper(OtherHelper hhh){
this.h = hhh;
}
------------------------------------------------------------------------------
缺省情况下,@Resource注解,是按照类型【byType】进行注入!
@Resource注解,既可以放到setters方法前面,也可以直接定义到实例变量前面
----------------------------------------------------------------------------------
在Spring配置文件中增加:
,可以允许Spring自动扫描类路径中的类
并对定义了特殊注解的类进行管理
-------------------------------------------------------------------------------
- @Component("beanId") : 告诉Spring,这个类需要由Spring来管理
- @Scope("prototype") : 可以指定这个类的Scope属性
-----------------------------------------------------------------------------
自动扫描代码例:
xml:
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">
UserAction
package cn.com.leadfar;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component("userAction")
//需要spring来管理.也就是说spring 可以找到这个类.
public class UserAction {
private UserService userSer;
public void add(){
System.out.println("add");
userSer.addUser("1", "2");
}
@Resource
//这个是需要注入的
//一个set方法..
public void setUserSer(UserService userSer) {
this.userSer = userSer;
}
}
总结起来就是.在xml里配置Scan后.在需要管理的类上面加@Component 然后一个方法前面加@Resource 应该可以这么理解
也可以不用set方法.把@Resource加到 Private UserService userSer;上面
[/code]
UserAction
package cn.com.leadfar;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component("userAction")
//需要spring来管理.也就是说spring 可以找到这个类.
public class UserAction {
@Resource
private UserService userSer;
public void add(){
System.out.println("add");
userSer.addUser("1", "2");
}
//@Resource
//这个是需要注入的
//一个set方法..
//public void setUserSer(UserService userSer) {
// this.userSer = userSer;
//}
}
有什么不对的地方可以指出来...偶现在正在入门..不要喷..咱心平气和的说..