好看的网站颜色,外贸营销网站推广,网站建设技术清单,自己在公司上班做网站宣传 侵权吗作者#xff1a;学Java的冬瓜 博客主页#xff1a;☀冬瓜的主页#x1f319; 专栏#xff1a;【Framework】 主要内容#xff1a;往spring中存储Bean对象的三大方式#xff1a;XML方式(Bean标签)#xff1b;五大类注解#xff1b;方法注解。从spring中取对象的两种方式… 作者学Java的冬瓜 博客主页☀冬瓜的主页 专栏【Framework】 主要内容往spring中存储Bean对象的三大方式XML方式(Bean标签)五大类注解方法注解。从spring中取对象的两种方式基本方法、注解方法(属性注入、set注入、构造方法注入)。 文章目录 Spring中Bean的存取方式一、三大方式存储对象到spring容器中1、XML方式把Bean存储到spring1.1、创建Bean类1.2、将Bean注册到Spring的xml配置文件 2、五大类注解方式 Controller等存储Bean到spring2.1、五大类注解和JavaEE标准分层2.2、五大类注解方式 往spring中 存储Bean对象 3、方法注解方式 Bean存储对象到spring中3.1、实体类的命名3.2、存储Bean对象 二、获取Bean对象(依赖注入)1、获取对象的最基本的方法2.1、获取Spring容器方式法一BeanFactory接口和ClassPathResource继承类法二ApplicationContext接口和ClassPathXmlApplicationContext继承类 2.2、getBean获取指定的Bean对象2.3、获取Bean对象的名称的命名源码分析 2、使用依赖注入从spring获取对象2.1、法一属性注入2.2、法二setter注入2.3、法三构造方法注入补充在依赖注入中 Autowired和 Resource的区别 Spring中Bean的存取方式 在Spring中Bean的装配方式有两种xml方式和注解方式。自己开发的类可以使用Component注解或xml方式装配推荐使用注解因为更加简洁方便。 引入第三方库的包可以使用Bean注解的方式或xml的方式推荐使用xml方式将库的内容和自己的代码分离。 一、三大方式存储对象到spring容器中
1、XML方式把Bean存储到spring
1.1、创建Bean类 a. 在Java目录下创建多级目录包com.spring.bean在该包下创建Student类和Teacher类 b. Bean对象中Student类如下(Teacher类的属性和方法与之相似有私有属性有Set和Get方法构造方法) package com.spring.bean;public class Student {private String name;private int age;public Student(){System.out.println(init Student);}public void wmi(){System.out.println(I am student: my name is name);}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}
}
1.2、将Bean注册到Spring的xml配置文件 a. 在resources下创建spring中对象注册的配置文件可以命名为spring-config.xml b.将下列配置信息粘贴到配置文件中并且使用bean标签对student和teacher类进行注册注册时id属性是对保存到spring中的对象的重命名class 属性是该类在项目中的路径包名类名而相应的文件会从spring依赖中自动获取。 ?xml version1.0 encodingUTF-8 ?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd!--将类对象com.spring.bean.Student存进spring容器名字是student是一个spring bean--bean idstudent classcom.spring.bean.Student/bean idteacher classcom.spring.bean.Teacher/
/beans2、五大类注解方式 Controller等存储Bean到spring
2.1、五大类注解和JavaEE标准分层 A五大类注解 Controller控制器验证用户请求的数据的正确性 。 Service服务调度具体的执行方法。 Repository用户持久层和数据库进行交互。 Component组件工具类 Configuration配置项项目中的一些配置。为什么有配置项类有很多原因有一个就是在启动程序时配置文件不一定会加载这时就需要使用配置项来起到在程序运行时告诉程序需要先加载配置文件的作用。 BJavaEE标准分层 在后端的分层当中至少有控制层、服务层数据持久层三个层次。 C使用五大类注解和标准分层规范项目 下图中实体类使用entity或model表示其他部分按照五大类注解的方式分层分出控制器类服务类数据库操作类组件配置文件类。 2.2、五大类注解方式 往spring中 存储Bean对象 A创建包Bean对象并给类(Bean对象)添加适当的五大类注解 注意满足需要存储在spring中的类在配置文件的base-package中且这个类使用了五大类注解就可以使用spring进行存取。 B创建spring配置文件spring-config.xml并在配置文件中注册可能要存入spring所有类的所在包 在下图中可能存入spring的类是TestController包下的任意一个类(或TestController包的字包中的类)。如下图springTest包的子包中的类都将保存在spring中所以注册包springTest base-packagespringTest 注意点
在配置文件中注册可能涉及的包和存储的类使用五大类注解二者缺一不可如果缺少报错说没有找到这个Bean对象。需要存储在spring中的类本身的位置可以在注册的包中或者它的子包中。使用五大类注解和注册包这个方法与使用bean标签(XML方式)使用路径包名类名的方式可以混合使用。即如果存在某个类需要存储在spring中但又不适合放在注册的包里的任何位置就可以将这个类放在注册包之外但是使用bean注册当前类对象即使用XML的方式存取对象。
3、方法注解方式 Bean存储对象到spring中
3.1、实体类的命名 补充 实体类的管理实体类不交给spring管理由我们自己管理。 实体类的命名 DO基本对象和数据库表结构一一对应如UserEntity或UserDO或者直接和数据库表名一致 User。 VO扩展对象前端传给后端的对象。如UserVO使用多个VO描述各种业务。 3.2、存储Bean对象
要点
1 方法注解需要配合五大类注解使用。比如UserBeans类下有多个方法注解在UserBeans上需要加上五大类注解(一般是Component)。之所以如此是为了提高效率。2 方法注解的对象名可以改名。方法注解 对象的名字不同于五大类注解方法注解是默认方法名但是可以在方法注解Bean后加括号使用name或value属性给Bean对象改名。 注意
给Bean对象改名后就不能再使用方法名获取到对象只能使用修改后的名字。如果存在方法名相同的两个Bean方法在不同类中(都未修改名字)当获取Bean对象时可以在方法上添加Order(数字)数字小的方法会先注入但是后注入的方法会发生覆盖。
二、获取Bean对象(依赖注入)
1、获取对象的最基本的方法
2.1、获取Spring容器方式 a.目的相同 BeanFactory和ApplicationContext的目的相同都是为了获取到spring容器 b.实现不同 BeanFactory是使用类似于懒汉模式进行类加载并进行对象的初始化(获取到spring后使用getBean方法获取对象时才进行相关对象的类加载并进行对象的初始化)。 ApplicationContext则是使用类似于饿汉模式(一获取spring容器会立即加载配置文件并进行对象的初始化(执行构造方法静态方法静态代码块等)) c.父子关系BeanFactory是ApplicationContext的子类 法一BeanFactory接口和ClassPathResource继承类 给ClassPathResource传参spring的配置文件的文件名给XmlBeanFactory传参ClassPathResource文件最后BeanFactory接口接收其子类XmlBeanFactory类。 // 获取spring容器
BeanFactory beanFactory new XmlBeanFactory(new ClassPathResource(spring-config.xml));使用BeanFactory和XmlBeanFactory和ClassPathResource获取Bean对象完整代码 import com.spring.bean.Student;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;public class TeacherMain {public static void main(String[] args) {// 懒汉加载调用时才加载spring容器中的bean对象效率不高但是内存消耗低。BeanFactory factory new XmlBeanFactory(new ClassPathResource(spring-config.xml));Student student (Student) factory.getBean(student);student.wmi();}
}法二ApplicationContext接口和ClassPathXmlApplicationContext继承类 获取spring容器使用ApplicationContext接收其子类ClassPathXmlApplicationContext给ClassPathXmlApplicationContext传参配置文件的文件名 // 获取Spring容器
ApplicationContext context new ClassPathXmlApplicationContext(spring-config.xml);使用ApplicationContext接口和其子类ClassPathXmlApplicationContext获取Bean对象的完整代码 import com.spring.bean.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class StudentMain {public static void main(String[] args) {// 饿汉加载一次性加载并初始化spring配置文件中的对象后续操作spring容器中的bean对象时会很快但是费内存。// 1通过resources文件夹中的xml文件名获取spring容器ApplicationContext context new ClassPathXmlApplicationContext(spring-config.xml);// 2获取Bean对象Student student2 context.getBean(student, Student.class);// 3使用spring bean对象student.wmi();}
}2.2、getBean获取指定的Bean对象 getBean方法的参数可以使用多种方式进行传参 一使用名称获取 二、使用类型获取如果存储两个名称不同类型相同的对象会找不到唯一的Bean从而报错 三、使用名称类型获取(最保险不容易出错) 2.3、获取Bean对象的名称的命名源码分析
在获取Bean对象时Bean对象名是什么 首先为了突出重点我们先直接亮出结论 规律 ①如果需要保存在spring中的对象所属的类 的首字母和第二个字母都大写如ACar-ACar那么Bean对象的名字为原类名。使用context.getBean(原类名, 类名.class)方式从spring中获取对象。 ②如果不是情况一那就把首字母小写(如A-aRedCar-redCar)。如要从spring中获取一个CarController使用context.getBean(carController, CarController.class)获取CarController对象。 现在我们查看spring源码印证我们的结论 A操作双击shift键搜索BeanName找到好几个类因为我们是要找Bean的命名规则根据Bean的命名英文推导一个一个去找我这里直接给出结论双击shift键搜索BeanName出现下图点击AnnotationBeanNameGenerator注解BeanName生成类)。 B点击左边的structure弹出该类的各种方法。点击generatorBeanName方法。按住ctrl点击下图中调用的方法。 C在generatorBeanName方法中 ctrl点击方法调用跳转到BuildDefaultBeanName参数一参数二在该方法中再次ctrl点击方法调用跳转到它的重载函数BuildDefaultBeanName(参数)。再使用ctrl点击方法调用跳转到了最终的目的函数。 D目的函数Introspector类的decapitalize方法中 注意 decapitalize方法中传入的参数name是要存入spring的对象所属的类名。 如果传入的参数是null或者参数长度为0那么直接返回类名代表这个存入spring的对象的名字是null或空字符串。 如果传入的参数长度大于1且首字母和次首字母都是大写那么直接返回类名代表这个存入spring的对象的名字是原类名。 如果传入参数不是null长度大于0如果只有一个字母将首字母小写返回。如果有多个字母且首字母和第二个字母不都是大写那就将原类名的第一个字母小写返回作为存入spring的对象的名字。 E结论 spring代码生成Bean对象的命名是使用jdk的标准起名的 看下图在上面的操作C时点击标出来的蓝色框定位当前类AnnotationBeanNamGenerator的位置可以看到这个类是存在于spring源码中的。 操作C完成后跳转到到Introspector类的decapitalize方法中再寻找Introspector类的所在位置如下图它出现在了jdk的rt.jar中。 2、使用依赖注入从spring获取对象 注意指在Controller的类中注入Service在Service中注入Repository。学spring到目前为止暂时无法实现 在main方法所在的类中注入Controller在main中只能使用getBean获取对象后续在springboot中则不需要main方法而是tomcat自动执行。 2.1、法一属性注入 属性注入 步骤A加注解 Autowired 步骤B写要注入的类作为当前类的属性。 如下图 属性注入优缺点 优点简单易操作。 缺点 1 无法实现final修饰的变量的注入如private final CarService carService使用属性注入无法成功注入 2 兼容性不足只适用于IoC容器 3 易违反单一设计原则(注入多个对象做多个功能)。 2.2、法二setter注入 setter注入 步骤A要注入对象作为当前类的属性。 步骤B注解Autowired set方法给要注入的对象赋值。参数是自己从spring中取出来传给set方法作为参数set注入的优缺点 优点严格遵循单一设计原则 缺点 1 无法实现final修饰的变量注入 2 注入的对象有被修改的风险因为set方法是public修饰的。 2.3、法三构造方法注入 构造方法注入 步骤A要注入对象作为当前类的属性。 步骤B注解构造方法给注入对象赋值。参数是自己从spring中取出来传给构造方法作为参数 构造方法注入优缺点 优点 1可以实现final修饰变量的注入。在Java中final修饰的变量要么直接赋值要么在构造方法中赋值这是语法规定因此构造方法可以实现final修饰变量的注入而set方法无法实现 2注入对象无法被修改因为构造方法只执行一次。 3 构造方法注入可以保证注入对象被完全初始化。因为构造方法注入是对象实例化的过程中进行的而属性注入和set注入是在对象实例化之后进行的。 4 通用性更好因为是Java语法规定不仅仅适用于IoC容器。 补充在依赖注入中 Autowired和 Resource的区别 问题1 Autowired和 Resource有时可以替换有时不行接下来分析它们的区别 来源不同Autowired来自springResource来自JDK 使用范围不同Autowired可以适用于三种注入Resource只支持属性注入和set注入不支持构造方法注入。 参数个数和类型不同Resource支持多个参数设置适用于同一个类注入多个对象情况对修改对象名字上更加灵活Autowired只有一个boolean类型的参数设置。 查找Bean对象方式不同Autowired先根据类型查找后根据名称查找(注入变量的名称)ByTypeResource先根据名称查找后根据类型查找ByName。 问题2当存储了同类型的多个对象时可以使用两种方式依赖注入对象。 1 Resource参数的设置 2 Autowired Qualifier(value“对象名”)