Spring学习笔记二之IOC(xml实现)

来源:互联网 发布:mac 自动关机命令 编辑:程序博客网 时间:2024/05/29 07:37

今天正式开始学习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中:

<?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/beanshttp://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/beanshttp://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;}@Overridepublic void save(User user) {// TODO Auto-generated method stubSystem.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/beanshttp://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中这样子该:

<beanname="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/beanshttp://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中的userDao1userDao2自动和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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"default-autowire="byName"


原创粉丝点击