spring总结之二(Bean作用域依赖注入)

Posted shijinglu2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring总结之二(Bean作用域依赖注入)相关的知识,希望对你有一定的参考价值。

### Bean的作用域:单例(singleton),多例(prototype)

1.单例模式:表示在任何地方使用对象,总是一个(对象是唯一的)。

笔面试重点

饿汉式

public class King{
    private final static King king = new King();
    private King(){

    }
    public static King getKing(){
        return king;
    }
}

懒汉式

public class King{
    private  static King king ;
    private King(){

    }
    public static King getKing(){
        if(king==null){
            king = new King();
            return king;
        }else{
            return king;
        }
    }
}


public class King{

}

<bean id="king" class="xx.xx.King"/>

King king1 = ac.getBean("king",King.class);
King king2 = ac.getBean("king",King.class);

System.out.println(king1==king2)

 


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

开发步骤

 

1.创建maven工程

1)添加web.xml
2) 添加Tomcat运行环境
3)添加依赖jar包  spring-webmvc  junit
4)添加配置文件

2.编写King类

public class King {

}

3.在配置文件中配置Bean

     <!-- 默认spring实例化的对象是单例的
        1.scope表示设置对象的作用域
        2.如果把对象设置为多例,那么scope="prototype"
        3.singleton表示单例的属性值
     -->
  <bean id="king" 
        class="cn.tedu.spring.bean.King"
        scope="singleton"/>


###Bean的延迟加载

1.立即加载:在spring容器读取配置文件时候,对象就被创建,这个时候创建的对象就是立即加载

2.延迟加载: 不是读取配置文件时创建对象,而是使用对象时创建对象。 好处:可以节省内存

3.配置延迟加载

     <!-- 
        默认创建对象的时机是立即加载
        1.lazy-init表示设置是否延迟加载
        2.lazy-init="true"表示延迟加载
   -->
  <bean id="king1" 
        class="cn.tedu.spring.bean.King"
        scope="singleton"
        lazy-init="true"/>

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


###  IOC(重要):控制反转(Inversion Of Control),原来创建对象和管理对象由程序代码完成,使用spring之后,创建对象和管理对象的权利交给spring容器(交给配置文件)控制权的转移叫控制反转


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

###给成员变量赋值(依赖注入DI)

spring中赋值的两种方式:1.set方法  2.构造方法

思路:页面-控制器-业务层-持久层

 

1.使用set方法赋值(推荐使用)

1.在cn.tedu.dao包新建接口UserDao

public interface UserDao{
    void insertUser();
    void updateUser();
    void deleteUser();
    void seletById();
    void seleteAll();
}
2.新建接口的实现类:把接口中的方法实现,在方法中做控制台输出

public class UserDaoImpl implements UserDao{
    public void insertUser(){
        System.out.println("添加成功");
    }
   ......
}
3.在cn.tedu.service包中定义业务层的接口UserService

public interface UserService{
    void addUser();
}   
4.新建接口的实现类UserServiceImpl

public class UserServiceImpl implements UserService{
    private UserDao userDao;
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    public void addUser(){
        userDao.insertUser();
    }
}

 

5.配置文件

<bean id="userDao" class="cn.tedu.dao.UserDaoImpl"/>

<bean id="userService" class="cn.tedu.service.UserServiceImpl">
    //1.property表示给成员变量(属性)赋值
    //2.调用set方法
    //3.name表示属性名
    //4.ref表示bean的id名

    <property name="userDao" ref="userDao"/>

</bean> 

 

测试:

getBean("userService",XXX);

cn.tedu.servlet

public class UserServlet{
    pivate UserServie userService;
    //setXX...
    public void doGet(){
        userService.addUser();
    }
}

 


实例化UserServlet,使用set方法给userService依赖注入

测试:获取UserServlet对象,调用doGet方法

2.构造方法赋值

1.定义带参的构造方法

public UserServletImpl(){}
public UserServletImpl(UserDao userDao){
    this.userDao = userDao;
}

<bean id="userService2" class="cn.tedu.service.UserServiceImpl">
    //constructor-arg表示构造方法赋值
    //index表示构造方法参数的索引,从0开始
    //ref表示已经实例化的对象的id属性值
    <constructor-arg index="0" ref="userDao"/>
</bean>

 

3.自动装配(了解)

(省略)

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

 

未完待补

思路:页面-控制器-业务层-持久层

 它们之间关系如何?百度,分析day08代码总结。

































以上是关于spring总结之二(Bean作用域依赖注入)的主要内容,如果未能解决你的问题,请参考以下文章

Spring注解基础学习总结

spring学习总结——高级装配学习三(Bean的作用域)

Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.5.3 依赖于原型Bean的单例Bean

Spring_总结_04_高级配置_运行时注入值

Spring 依赖注入

Spring(Ioc和Bean的作用域)