zoukankan      html  css  js  c++  java
  • 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)在pom.xml添加依赖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.sjl.spring.bean.King" 
                scope="singleton"/>

    ###Bean的延迟加载

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

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

    3.配置延迟加载

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

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

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

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

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

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

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

    1.在cn.sjl.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.sjl.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.sjl.dao.UserDaoImpl"/>
    
    <bean id="userService" class="cn.sjl.service.UserServiceImpl">
        //1.property表示给成员变量(属性)赋值
        //2.调用set方法
        //3.name表示属性名
        //4.ref表示bean的id名
        <property name="userDao" ref="userDao"/>
    </bean> 

    测试:

    getBean("userService",XXX);
    
    cn.sjl.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.sjl.service.UserServiceImpl"> //constructor-arg表示构造方法赋值 //index表示构造方法参数的索引,从0开始 //ref表示已经实例化的对象的id属性值 <constructor-arg index="0" ref="userDao"/> </bean>

    3.自动装配(了解)

    byName   byType

     

    //1.autowire表示使用自动装配的方式给成员变量赋值

    //2.byName表示匹配UserServiceImpl属性名赋值

    <bean id=“userService3” class=“xxx.xx.UserServiceImpl”  autowire=“byName”/>

    //1.byType表示根据属性的类型匹配UserDao userDao;

    //2.如果匹配的相同类型的对象有多个,会出现异常。

    <bean id=“userService4” class=“xxx.xx.UserServiceImpl”  autowire=“byType”>

     再看看书(新书和旧书),这个Spring笔记2,配置文件id是接口名,一个好像是实现类的名字,还是说id这个是随意的,是多态的上溯造型?还是随意的?自动装配的相关注解看看;

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








    成年人的世界没有那么多的童话,也没有那么多的逆袭。
  • 相关阅读:
    mybatis几种开发方式
    SpringData,JPA,MongoDB,Solr,Elasticsearch底层逻辑关系
    简论远程通信(RPC,Webservice,RMI,JMS的区别)
    spring/spring boot/spring mvc中用到的注解
    Centos常用命名
    Mybatis详解
    Java成长之路
    Hibernate 与Mybatis之比较
    Struts2 与SpringMVC之比较
    Maven 配置文件详解
  • 原文地址:https://www.cnblogs.com/shijinglu2018/p/9535883.html
Copyright © 2011-2022 走看看