Spring学习笔记二之IOC(xml实现)
2013-12-04 18:14
519 查看
今天正式开始学习Spring,Spring主要分为两大块,一个是IOC,一个是AOP,IOC相对于AOP来说比较简单,所以先从IOC学起,实现IOC分为两种方式,一中是通过配置文件,另外一种是通过注解的方式,接下来先用配置文件来实现:
一.Bean的注入类型(三种方式):
1. 通过setter注入:
这种注入方式是最常用的一种,先要在service层中提供dao层的set和get方法:
package com.limitvic.service;
import com.limitvic.dao.UserDao;
import com.limitvic.dao.impl.UserDaoImpl;
import com.limitvic.domain.User;
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(User user) throws Exception{
userDao.save(user);
}
}
在beans.xml中:
2. 通过构造方法注入:
在service层中写一个构造函数:
在beans.xml:
3. 接口方法注入:
接口注入很少用到,而且还会增加代码量,所以在这里就不介绍了。
二.简单属性注入:
如何在实现dao的dao.impl中存在属性,可以再beans.xml中直接进行值得注入:
可以在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.xsd"> <bean id="u" class="com.limitvic.dao.impl.UserDaoImpl">
<property name="test1" value="8"></property>
<property name="test2" value="test2"></property>
</bean>
<bean name="userService" class="com.limitvic.service.UserService">
<constructor-arg>
<ref bean="u"/>
</constructor-arg>
</bean>
</beans>
这样子就可以把值直接注入给test1 和test2了。
三.Bean 的范围属性Scope:
其中singleton和prototype较为常用,一个是指单例,另一个指的是原型,而剩下的三个一般在Spring 和其他框架相结合时才会用到,先来看看Scope这个属性到底是做什么用的,Spring中默认的是singleton。
所以可以写这样的代码:
UserServiceuserService = (UserService)factory.getBean("userService");
UserServiceuserService2 = (UserService)factory.getBean("userService");
这样子获得的两个UserService的对象其实是同一个,因为系统内部创建对象时是用单例模式。
但如果在beans.xml中这样子该:
<bean
name="userService"class="com.limitvic.service.UserService"
scope="prototype">
那么获得这两个UserService 对象才是不一样的,每次创建对象时创造一个新的。
四.自动装配:
这里要用到一个属性叫做autowire, 在bean中一般这样子赋值:
autowire = “byName”或者 autowire = “byType” 再或者autowire = “default”
分别是按照名字自动匹配,按照类型自动匹配,或者按照默认值自动匹配。
这里举个例子:
在beans.xml中:
在service层中:
通过autowire这个属性,可以把bean中的userDao1和userDao2自动和service中的userDao1属性进行比对,如果比对成功,可知userDao1比对成功,就将bean中的userDao1注入给service中的userDao1。
如果所有的bean都用同一种装配方式:可以在beans.xml开头写上default-autowire="byName",具体代码如下:
一.Bean的注入类型(三种方式):
1. 通过setter注入:
这种注入方式是最常用的一种,先要在service层中提供dao层的set和get方法:
package com.limitvic.service;
import com.limitvic.dao.UserDao;
import com.limitvic.dao.impl.UserDaoImpl;
import com.limitvic.domain.User;
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add(User user) throws Exception{
userDao.save(user);
}
}
在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.xsd"> <bean id="u" class="com.limitvic.dao.impl.UserDaoImpl"> </bean> <bean id="userService" class="com.limitvic.service.UserService"> <property name="userDao" ref="u"/> </bean> </beans>
2. 通过构造方法注入:
在service层中写一个构造函数:
package com.limitvic.service; import com.limitvic.dao.UserDao; import com.limitvic.dao.impl.UserDaoImpl; import com.limitvic.domain.User; public class UserService { private UserDao userDao; public UserService(UserDao userDao){ this.userDao = userDao; } public void add(User user) throws Exception{ userDao.save(user); } }
在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.xsd"> <bean id="u" class="com.limitvic.dao.impl.UserDaoImpl"> </bean> <bean id="userService" class="com.limitvic.service.UserService"> <constructor-arg> <ref bean="u"/> </constructor-arg> </bean> </beans>
3. 接口方法注入:
接口注入很少用到,而且还会增加代码量,所以在这里就不介绍了。
二.简单属性注入:
如何在实现dao的dao.impl中存在属性,可以再beans.xml中直接进行值得注入:
package com.limitvic.dao.impl; import com.limitvic.dao.UserDao; import com.limitvic.domain.User; public class UserDaoImpl implements UserDao{ private int test1; private String test2; public int getTest1() { return test1; } public void setTest1(int test1) { this.test1 = test1; } public String getTest2() { return test2; } public void setTest2(String test2) { this.test2 = test2; } @Override public void save(User user) { // TODO Auto-generated method stub System.out.println("已保存"+user.getUsername()+"的用户信息"); System.out.println("test1="+test1); System.out.println("test2="+test2); } }
可以在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.xsd"> <bean id="u" class="com.limitvic.dao.impl.UserDaoImpl">
<property name="test1" value="8"></property>
<property name="test2" value="test2"></property>
</bean>
<bean name="userService" class="com.limitvic.service.UserService">
<constructor-arg>
<ref bean="u"/>
</constructor-arg>
</bean>
</beans>
这样子就可以把值直接注入给test1 和test2了。
三.Bean 的范围属性Scope:
其中singleton和prototype较为常用,一个是指单例,另一个指的是原型,而剩下的三个一般在Spring 和其他框架相结合时才会用到,先来看看Scope这个属性到底是做什么用的,Spring中默认的是singleton。
所以可以写这样的代码:
UserServiceuserService = (UserService)factory.getBean("userService");
UserServiceuserService2 = (UserService)factory.getBean("userService");
这样子获得的两个UserService的对象其实是同一个,因为系统内部创建对象时是用单例模式。
但如果在beans.xml中这样子该:
<bean
name="userService"class="com.limitvic.service.UserService"
scope="prototype">
那么获得这两个UserService 对象才是不一样的,每次创建对象时创造一个新的。
四.自动装配:
这里要用到一个属性叫做autowire, 在bean中一般这样子赋值:
autowire = “byName”或者 autowire = “byType” 再或者autowire = “default”
分别是按照名字自动匹配,按照类型自动匹配,或者按照默认值自动匹配。
这里举个例子:
在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.xsd"> <bean id="userDao1" class="com.limitvic.dao.impl.UserDaoImpl"> <property name="id" value="1"></property> </bean> <bean id="userDao2" class="com.limitvic.dao.impl.UserDaoImpl"> <property name="id" value="2"></property> </bean> <bean name="userService" class="com.limitvic.service.UserService" autowire="byName"> </bean> </beans>
在service层中:
package com.limitvic.service; import com.limitvic.dao.UserDao; import com.limitvic.dao.impl.UserDaoImpl; import com.limitvic.domain.User; public class UserService { private UserDao userDao1; public void add(User user) throws Exception{ userDao1.save(user); } public UserDao getUserDao() { return userDao1; } public void setUserDao(UserDao userDao) { this.userDao1 = userDao; } }
通过autowire这个属性,可以把bean中的userDao1和userDao2自动和service中的userDao1属性进行比对,如果比对成功,可知userDao1比对成功,就将bean中的userDao1注入给service中的userDao1。
如果所有的bean都用同一种装配方式:可以在beans.xml开头写上default-autowire="byName",具体代码如下:
<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.xsd" default-autowire="byName"
相关文章推荐
- 【Spring学习笔记-MVC-18.1】Spring MVC实现RESTful风格-同一资源,多种展现:xml-json-html
- Spring学习笔记 IOC原理实现
- spring ioc容器的学习笔记4---XmlBeanFactory ioc容器的简单设计原理解析
- Spring笔记(一)——xml方式实现IoC和DI
- Spring学习笔记 使用XML配置实现Bean的auto-wiring (自动绑定)
- spring ioc容器的学习笔记2---ioc容器系列的设计与实现
- Spring学习笔记(二)-----IOC之XML
- Spring.NET学习笔记3——实现一个简易的IoC框架(练习篇)(转)
- Spring学习之路第一步 : xml方式实现IOC(控制反转)
- Spring学习笔记(一)IOC与Spring基础xml配置
- Spring学习笔记-IOC高级特性3-用Java Config简化XML配置
- spring学习笔记:Spring IOC容器,Spring源码
- Spring framework IOC 学习笔记
- Spring学习笔记1——IOC: 尽量使用注解以及java代码
- MyBatis学习笔记-Spring集成DAO层实现方式记录
- Thrift学习笔记(6)--Spring集成Thrift,实现服务端和客户端代理
- JavaWeb学习笔记-spring-04-ioc-bean装载
- Spring揭秘 学习笔记一 (Spring的IoC容器 二)
- spring中Bean的xml方式配置学习笔记
- Spring-IOC-学习笔记(1)