码迷,mamicode.com
首页 > 编程语言 > 详细

spring bean管理 1

时间:2015-04-28 20:16:51      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

轻量级,无侵入

Bean管理
  1 创建applicationContext.xml
  2 配置被管理的Bean
  3 获取Bean

pom.xml配置

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>3.2.12.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>3.2.12.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.12.RELEASE</version>
    </dependency>

1 创建applicationContext.xml 

<!-- 打开jar包,docs,spring-framework-reference,html,index,打开后有一行
点击 这一行 D. XML Schema-based configuration -->

<?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">


</beans>

2 配置被管理的Bean


比如我们需要对某个dao进行操作,这个dao中有一些方法

public class UserDao{
  public UserDao() {}
  public void save() {}
  public void init() {}
  public void destroy() {}
}

<!-- 把类交给spring管理,用bean节点 ,class是受管理的完全限定名,
    id,也可以用name(name就可以取多个名字)
    <bean name="userDao,myDao" class="com.kaishengit.dao.UserDao"></bean>
    
    如果用id表示,还想给他赋name属性
    <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
    <alias name="userDao" alias="myDao"/>
    name处放id的值
    -->
<bean id="userDao" class="com.kaishengit.dao.UserDao"></bean>

3 获取Bean

public class Test {
    public static void main(String[] args) {
        //读取applicationContext.xml配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*以前创建对象是new,现在交给spring后,就是用getBean,userDao是配置中id的名字*/
        UserDao dao = (UserDao) context.getBean("userDao");
        dao.save();
    }
}    

表现其 无侵入性
只需要在UserDao中有定义这两个方法init ,destroy,就能在初始化时候执行init,销毁时执行--
destroy,而且在UserDao中没有导入什么什么包的

<bean id="userDao" class="com.kaishengit.dao.UserDao" init-method="init" destroy-method="destroy"/>


------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

交给spring的类,默认都是单例模式

    
/* 在容器启动的时候
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
就会读取这个文件,并且创建所有交给spring处理的类 */
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao = (UserDao) context.getBean("userDao");    
/*所以在getBean的时候就不会创建对象,即使是
    UserDao dao = (UserDao) context.getBean("userDao");    
    UserDao dao2 = (UserDao) context.getBean("userDao");    
    也只是执行一次构造方法,可以看出,这是单例模式*/

那么如何改变这种单例模式? 比如在action的时候,每次请求都要到达一个action--
这个是不能单例的

Bean scopes

1 singleton(默认)
<bean id="userDao" class="com.kaishengit.dao.UserDao" scope="singleton"></bean>

 


2 prototype
<bean id="userDao" class="com.kaishengit.dao.UserDao" scope="prototype"></bean>

/* 这时候在执行
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
的时候就不会创建所有交给spring的类,而是在getbean的时候去创建
 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao = (UserDao) context.getBean("userDao");
UserDao dao2 = (UserDao) context.getBean("userDao");    
就真的会执行两次构造方法,创建两个对象*/

-----------------------------------------------------------------------------------

-----------------------------------------------------------------------------------

Bean的延迟加载

<bean id="userDao" class="com.kaishengit.dao.UserDao" lazy-init="true"></bean>    
/* 这时候在执行
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
的时候就不会创建所有交给spring的类,而是在第一次使用getbean的时候去创建
 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao = (UserDao) context.getBean("userDao");
UserDao dao2 = (UserDao) context.getBean("userDao");    
但是还是只执行一次构造方法*/

------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------

IOC DI
  1. ICO 控制翻转
  2. DI 依赖注入
    注入的两种方式
      1 set注入
      2 构造方法注入

 

UserService依赖UserDao 以前是:

public class UserService {

    private UserDao userDao = new UserDao();
    public void save() {
        userDao.save();
    }
}

那么就不用new,选择set注入

public class UserService {
    
    private UserDao userDao;
    
    
    public void save(){
        System.out.println("1111");
    }
    //生成set方法
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

需要配置

 

<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService">
    <!-- name="userDao"是被注入类的属性名字 ,,是setUserDao的set后面的名字
    ref="userDao"的这个userDao要和上面的id名字一致    -->
    <property name="userDao" ref="userDao"/>
</bean>


<!-- 或者是这种形式 -->
    
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService">
    <!-- userDao是被注入类的属性名字 ,,是setUserDao的set后面的名字-->
    <property name="userDao">
    <!-- ref="userDao"的这个userDao要和上面的id名字一致    -->
        <ref bean="userDao"/>
    </property>
</bean>    
    
    
    <!-- 再或者是这种形式 -->
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService">
    <property name="userDao">
        <bean class="com.kaishengit.dao.UserDao"/>
    </property>
</bean>

 

 

 

------------------------------------------------------------------------
------------------------------------------------------------------------

其他set注入

public class BookService {

    private int age;
    private String name;
    private List<String> address;
    private Set<String> depts;
    private Map<String, String> maps;
    // 本身也是一个map结构 
    private Properties prop;
    
    
    public void show() {
        System.out.println("age:" + age);
        System.out.println("name:" + name);
        System.out.println("--------List---------");
        for(String str : address) {
            System.out.println(str);
        }
        System.out.println("--------Set----------");
        for (String str : depts) {
            System.out.println(str);
        }
        System.out.println("--------Map----------");
        for(Entry<String, String> entry : maps.entrySet()) {
            System.out.println(entry.getKey() + " :" + entry.getValue());
        }
        
        System.out.println("--------Properties--------");
        for(Entry<Object, Object> entry : prop.entrySet()) {
            System.out.println(entry.getKey() + " :" + entry.getValue());
        }
        
    }
    
    
    
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAddress(List<String> address) {
        this.address = address;
    }
    public void setDepts(Set<String> depts) {
        this.depts = depts;
    }
    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }
    public void setProp(Properties prop) {
        this.prop = prop;
    }

注入

<bean id="book" class="com.kaishengit.service.BookService">
    <property name="age" value="23"/>
    <property name="name" value="Alex"/>
    <property name="address">
        <list>
            <value>add1</value>
            <value>add2</value>
            <value>add3</value>
        </list>
    </property>
    <property name="depts">
        <set>
            <value>s1</value>
            <value>s2</value>
            <value>s3</value>
        </set>
    </property>
    
    <property name="maps">
        <map>
            <entry key="k1" value="v1"/>
            <entry key="k2" value="v2"/>
            <entry key="k3" value="v3"/>
        </map>
    </property>
    
    <property name="prop">
        <props>
            <prop key="p1">v1</prop>
            <prop key="p2">v2</prop>
            <prop key="p3">v3</prop>
        </props>
    </property>
    
</bean>

main函数中

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
BookService bookService = (BookService) context.getBean("book");
bookService.show();

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

 

构造方法注入 

public class UserService {

    private UserDao userDao;
    
    public UserService(UserDao userDao,String name) {
        this.userDao = userDao;
        System.out.println("name:" + name);
    }
    
    
    public void save() {
        userDao.save();
    }

}    

需要配置

<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
    
    <bean id="userService" class="com.kaishengit.service.UserService">
    <!-- name是上面构造方法中参数的userDao,ref指注入的是配置中id的userDao这个类
        不仅支持name,还支持index
        <constructor-arg index="0" ref="userDao"/>这里的index指的是给第几个--
        参数传值-->
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="name" value="Jack"/>
    </bean>    

========================================================================

========================================================================

========================================================================

接下来再说一个自动注入的

<!-- 自动注入 

    autowire="byName"之后就在整个配置文件中找setXxx方法的这个id叫做xxx的
    比如setUserDao,就找id为userDao的,所以id就不能随便改-->
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService" autowire="byName"/>
    
    <!-- 去寻找类型匹配的数据com.kaishengit.dao.UserDao 
        但是有多个相同类型的就不行了---->
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService" autowire="byType"/>
    
    
    <!-- 构造方法注入,这种方法是先byName,找不到,就byType -->
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService" autowire="constructor"/>

 

spring bean管理 1

标签:

原文地址:http://www.cnblogs.com/itliucheng/p/4463641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!