首页 > 其他分享 >spring 依赖注入DI(三)

spring 依赖注入DI(三)

时间:2023-02-13 16:35:36浏览次数:48  
标签:依赖 实例 DI 作用域 spring void bean session public

概念

依赖注入(Dependency Injection,DI)。

依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .

注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

Set 注入 (重点)

要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .
测试pojo类 :

Address.java

 public class Address {
 
     private String address;
 
     public String getAddress() {
         return address;
    }
 
     public void setAddress(String address) {
         this.address = address;
    }
 }
Student.java

 package com.kuang.pojo;
 
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
 public class Student {
 
     private String name;
     private Address address;
     private String[] books;
     private List<String> hobbys;
     private Map<String,String> card;
     private Set<String> games;
     private String wife;
     private Properties info;
 
     public void setName(String name) {
         this.name = name;
    }
 
     public void setAddress(Address address) {
         this.address = address;
    }
 
     public void setBooks(String[] books) {
         this.books = books;
    }
 
     public void setHobbys(List<String> hobbys) {
         this.hobbys = hobbys;
    }
 
     public void setCard(Map<String, String> card) {
         this.card = card;
    }
 
     public void setGames(Set<String> games) {
         this.games = games;
    }
 
     public void setWife(String wife) {
         this.wife = wife;
    }
 
     public void setInfo(Properties info) {
         this.info = info;
    }
 
     public void show(){
         System.out.println("name="+ name
                 + ",address="+ address.getAddress()
                 + ",books="
        );
         for (String book:books){
             System.out.print("<<"+book+">>\t");
        }
         System.out.println("\n爱好:"+hobbys);
 
         System.out.println("card:"+card);
 
         System.out.println("games:"+games);
 
         System.out.println("wife:"+wife);
 
         System.out.println("info:"+info);
 
    }
 }

1、常量注入

 <bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
 </bean>

测试:

 @Test
 public void test01(){
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 
     Student student = (Student) context.getBean("student");
 
     System.out.println(student.getName());
 
 }

2、Bean注入

注意点:这里的值是一个引用,ref

 <bean id="addr" class="com.kuang.pojo.Address">
     <property name="address" value="重庆"/>
 </bean>
 
 <bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
     <property name="address" ref="addr"/>
 </bean>

3、数组注入

 <bean id="student" class="com.kuang.pojo.Student">
     <property name="name" value="小明"/>
     <property name="address" ref="addr"/>
     <property name="books">
         <array>
             <value>西游记</value>
             <value>红楼梦</value>
             <value>水浒传</value>
         </array>
     </property>
 </bean>

4、List注入

 <property name="hobbys">
     <list>
         <value>听歌</value>
         <value>看电影</value>
         <value>爬山</value>
     </list>
 </property>

5、Map注入

 <property name="card">
     <map>
         <entry key="中国邮政" value="456456456465456"/>
         <entry key="建设" value="1456682255511"/>
     </map>
 </property>

6、set注入

 <property name="games">
     <set>
         <value>LOL</value>
         <value>BOB</value>
         <value>COC</value>
     </set>
 </property>

7、Null注入

 <property name="wife"><null/></property>

8、Properties注入

 <property name="info">
     <props>
         <prop key="学号">20190604</prop>
         <prop key="性别">男</prop>
         <prop key="姓名">小明</prop>
     </props>
 </property>

测试结果:

Bean的作用域

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象 .

几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。

Singleton

当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置:

测试:

@Test
public void test03(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
User user2 = (User) context.getBean("user");
System.out.println(user==user2);
}

Prototype

当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。在XML中将bean定义成prototype,可以这样配置:

或者 ### Request 当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

<bean id="loginAction" class=cn.csdn.LoginAction" scope="request"/>
针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

Session

当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。考虑下面bean定义:

针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

补充session知识

什么是session

Session简单来说就是javax.servlet.http.HttpSession,它是一个类,我们常说的session也可以理解为HttpSession类的一个对象,这个对象可以调用一些方法,用来存取用户数据和用户的操作。

怎么使用session

  1. 先获取session对象
    在客户端第一次向浏览器端发送request请求并且服务器调用了req.getSession()方法时,服务器会自动创建Session对象,同时也会创建一个cookie,然后将session的id存储在cookie中并发送回客户端,客户端把这个cookie保存下来,每次请求时又会发送回服务器端(服务器帮你拿到了,你只需要获取session就行了)
  2. 拿到session后我们就可以向里面存东西了,利用如下代码session.setAttribute(“key”,value)向session中保存数据
    做完这一步,你已经创建了一个session并且保存了一个username。
    之后的每一次请求,客户端(浏览器)都会将你保存在cookie中的sessionid携带在Request Header中给到服务器,你只需要在服务器中再次使用代码。
    这个session的作用域是一次会话,什么是一次会话,就是你登陆进页面开始,到你退出登录或者关闭浏览器为止,这就是一次会话,一次会话包括多次请求。所以你在session中设置了一个值,这个值在你的整个会话期间都能够被获取到,你同样也可以在这个会话期间向session再存一些其他数据,这样就解决的HTTP协议无状态的问题。现在你通过一个html页面给我发请求,我先去拿我之前设置的session,拿到了,说明你刚刚登录过,我再根据你需求返回response,给你一个html页面。没拿到,也就说明你就没登陆过,我会给你返回一个登录页面让你重新登录。
  3. 拿到了session并向session里面设置了一个值username后,我们就可以在服务器端打印出session的id以及我刚才存储进去的username(username为dwd)

cookie和session的区别和联系

  1. 区别·
    (1)cookie是保存在客户端(浏览器)的
    session是保存在服务器端的
    (2)cookie保存在服务器端,可以被查看,所以安全性能差
    session保存在服务器端,安全性能较好
  2. 联系
    session是基于cookie工作的,因为sessionid是保存在cookie中的,会随着每一次会话发送回服务器端,然后服务器就能获取到session并在session中存取值。

————————————————
版权声明:本文为CSDN博主「elle`」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51697044/article/details/123894899

标签:依赖,实例,DI,作用域,spring,void,bean,session,public
From: https://www.cnblogs.com/boxer-nofear/p/17116818.html

相关文章

  • 【Spring IOC】Spring IOC 容器源码解析文章导读
    1 前言Spring老生常谈,JavaWeb程序员的必备,程序员不看源码不懂源码,路走不长,所以耐心看,边看操作。本文是SpringIOC源码分析系列文章的导读文章,将会着重介绍Spring的......
  • redis为何持久化及持久化策略
    一、Redis是什么?为什么需要持久化?1.Redis是什么?Redis是完全开源的,遵守BSD协议,是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三个特点:......
  • 面试难题:Spring AOP循环依赖,如何解决?
    面试难题:SpringAOP循环依赖,如何解决?问:Spring如何解决循环依赖?答:Spring通过提前曝光机制,利用三级缓存解决循环依赖(这原理还是挺简单的,参考:三级缓存、图解循环依赖原......
  • Maven依赖管理
    本文主要记录Maven依赖管理中关于依赖传递和依赖范围的知识Maven项目示例创建3个maven项目,分配依赖log4j1.2.12,1.2.13,1.2.14版本。<!--项目1--><groupId>com.le......
  • 【Spring-boot-route(十一)数据库配置信息加密+(十二)整合redis做为缓存】
    spring-boot-route(十一)数据库配置信息加密前言:SpringBoot最大的特点就是自动配置了,大大的减少了传统Spring框架的繁琐配置,通过几行简单的配置就可以完成其他组件的接入。比......
  • Codeforces Round #852 (Div. 2)(C,D)
    CodeforcesRound#852(Div.2)(C,D)B这个题大意是给你一个\(x\),\(y\),\(x\)是极大值(\(a_i>a_{i+1},a_i>a_{i+1}\))的和,\(y\)是极小值(\(a_i<a_{i+1},a_i<a_{i+1}\))的......
  • docker安装redis:6.0.8(挂载外部redis.conf启动)
    docker安装redis:6.0.8​​1、从dockerhub上(阿里云加速器)拉取redis镜像到本地​​​​2、在centos宿主机文件模板拷贝进/zzyyuse/redis目录下​​​​3、修改/zzyyuse/re......
  • Visual Studio Code 如何设置成中文语言
    VisualStudioCode是一款微软的代码编辑器,这款软件是比较不错的,用起来也比较方便,但是好多人在第一次安装的时候展现的是英文的,这对于一些小伙伴是比较头疼的问题,那如何调......
  • redis命令操作list和set&sortedset以及通用命令
    列表类型list:可以添加一个元素到列表的头部(左边)或者尾部(右边) 1.添加: 1.lpushkeyvalue:将元素加入列表左表 2.rpushkeyvalue:将元素加入列表右边 ......
  • Redis常用数据类型
    1.通用命令-KEYS:查看符合模板的所有key,`不建议在生产环境设备上使用`-DEL:删除一个指定的key-EXISTS:判断key是否存在-EXPIRE:给一个key设置有效期,有效期到期时该ke......