范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Spring容器之IoC依赖注入

  Spring容器之IoC(二)-- 依赖注入
  DI(Dependency Injection):依赖注入,依赖注入实现了控制反转的思想。指Spring创建对象的过程中,将对象依赖属性通过配置进行注入。 依赖指的是对象和对象之间的关联关系。注入指的是一种数据传递行为,通过注入行为来让对象和对象产生关系。
  依赖注入常见的实现方式包括两种:set注入和构造注入1. 依赖注入之setter注入
  ①创建学生类Student 该类需要包括无参构造函数,以及每个属性的set方法public class Student {     private Integer id;     private String name;     private Integer age;     private String sex;      public Student() {     }      public Integer getId() {return id;}     public void setId(Integer id) {this.id = id;}     public String getName() {return name;}     public void setName(String name) {this.name = name;}     public Integer getAge() { return age;}     public void setAge(Integer age) {this.age = age;}     public String getSex() {return sex;}     public void setSex(String sex) {this.sex = sex;}     @Override     public String toString() {         return "Student{" +                 "id=" + id +                 ", name="" + name + """ +                 ", age=" + age +                 ", sex="" + sex + """ +                 "}";     } } 复制代码
  ②配置bean时为属性赋值                                     复制代码
  再次强调一下:使用set注入必须给该属性提供一个set方法。 Spring容器会调用这个set方法,来给该属性赋值。这个set方法,可以是不使用IDEA工具生成的,也可以不符合javabean规范,但是这个方法必须是以set单词开始的也就是说前三个字母不能随便写,必须是以"set"开头若想让Spring调用对应的set方法,需要配置property标签,该标签的主要属性是name和ref,name的属性值是想要注入属性的set方法名去掉"set",然后把剩下的单词首字母变小写。ref翻译为引用,ref要指定的是要注入bean的id。(后面会讲property标签的value和ref标签的具体用法)2、依赖注入之构造器注入
  ①在Student类中添加有参构造public Student(Integer id, String name, Integer age, String sex) {     this.id = id;     this.name = name;     this.age = age;     this.sex = sex; } 复制代码
  ②配置bean
  spring-di.xml                      复制代码注意:
  constructor-arg标签还有两个属性可以进一步描述构造器参数:
  index属性:指定参数所在位置的索引(从0开始) name属性:指定参数名 直接根据类型去匹配3、Set注入详细使用3.1、特殊值处理
  了解一些特殊值的处理之前先了解一下spring里认为哪些被称为简单值类型,以下是BeanUtils类的方法,该方法的作用是检查给定类型是否表示"简单"值类型:基本数据类型或基本数据类型的包装器、枚举、字符串或其他字符序列、数字、日期、时态、URI、URL、区域设置或类,并且 void 不被视为简单值类型。:package org.springframework.beans;  public abstract class BeanUtils { ······ /**  * Check if the given type represents a "simple" value type: a primitive or  * primitive wrapper, an enum, a String or other CharSequence, a Number, a  * Date, a Temporal, a URI, a URL, a Locale, or a Class.  * 

{@code Void} and {@code void} are not considered simple value types. * @param type the type to check * @return whether the given type represents a "simple" value type * @see #isSimpleProperty(Class) */ public static boolean isSimpleValueType(Class<?> type) { return (Void.class != type && void.class != type && (ClassUtils.isPrimitiveOrWrapper(type) || Enum.class.isAssignableFrom(type) || CharSequence.class.isAssignableFrom(type) || Number.class.isAssignableFrom(type) || Date.class.isAssignableFrom(type) || Temporal.class.isAssignableFrom(type) || URI.class == type || URL.class == type || Locale.class == type || Class.class == type)); } ······ } 复制代码   下面再来看一些特殊的值,就是这些特殊的值该怎么注入到属性里面①字面量赋值什么是字面量?   int a = 10;   声明一个变量a,初始化为10,此时a就不代表字母a了,而是作为一个变量的名字。当我们引用a的时候,我们实际上拿到的值是10。   而如果a是带引号的:"a",那么它现在不是一个变量,它就是代表a这个字母本身,这就是字面量。所以字面量没有引申含义,就是我们看到的这个数据本身。 复制代码②null值   注入空字符串使用:或者 value=""   注入null使用: 或者 不为该属性赋值 复制代码注意:   复制代码   以上写法,name属性是有值的,所赋的值就是字符串‘null’③xml特殊字符   XML中有5个特殊字符,分别是:<、>、"、"、&   以上5个特殊符号在XML中会被特殊对待,会被当做XML语法的一部分进行解析,如果这些特殊符号直接出现在注入的字符串当中,会报错。举个例子: 复制代码   特殊字符   转义字符   >   >   <   <   "   "   "   "   &   &   除了使用实体符号来代替,也可以使用CDATA节 复制代码   注意:使用CDATA时,不能使用value属性,只能使用value标签。④Date   Date虽然被Spring认为是简单值类型,使用value赋值,但是value后的字符串不能随便写,格式必须符合Date的toString()方法格式,例如Thu Mar 02 18:06:45 HKT 2023。但是,Date也可以用ref进行赋值,用ref赋值的方式有很多,主要是看用什么样的方式构造出一个Date类型的对象。 复制代码3.2、为对象类型属性赋值   ①创建班级类Clazzpublic class Clazz { private Integer clazzId; private String clazzName; public Integer getClazzId() {return clazzId;} public void setClazzId(Integer clazzId) {this.clazzId = clazzId;} public String getClazzName() {return clazzName;} public void setClazzName(String clazzName) {this.clazzName = clazzName;} @Override public String toString() { return "Clazz{" + "clazzId=" + clazzId + ", clazzName="" + clazzName + """ + "}"; } public Clazz() {} public Clazz(Integer clazzId, String clazzName) { this.clazzId = clazzId; this.clazzName = clazzName; } } 复制代码   ②修改Student类   在Student类中添加以下代码:private Clazz clazz; public Clazz getClazz() { return clazz; } public void setClazz(Clazz clazz) { this.clazz = clazz; } 复制代码3.2.1、引用外部bean   配置Clazz类型的bean: 复制代码   为Student中的clazz属性赋值: 复制代码   错误演示: 复制代码如果错把ref属性写成了value属性,会抛出异常: Caused by: java.lang.IllegalStateException: Cannot convert value of type "java.lang.String" to required type "com.qiuye.spring6.bean.Clazz" for property "clazz": no matching editors or conversion strategy found   意思是不能把String类型转换成我们要的Clazz类型,说明我们使用value属性时,Spring只把这个属性看做一个普通的字符串,不会认为这是一个bean的id,更不会根据它去找到bean来赋值3.2.2、内部bean 复制代码3.2.3、级联属性赋值   使用级联属性赋值,被注入的类的该属性必须提供get方法,例如把Clazz对象注入到Student对象,Student类必须提供clazz属性的get方法,而且再Bean标签里面必须先给clazz赋值,再给clazz下的属性赋值,顺序不能颠倒。 复制代码3.2.4、为数组类型属性赋值   ①修改Student类   在Student类中添加hobbies属性,类型是数组:private String[] hobbies; public String[] getHobbies() { return hobbies; } public void setHobbies(String[] hobbies) { this.hobbies = hobbies; } 复制代码   ②配置bean 抽烟 喝酒 烫头 a 复制代码3.2.5、为集合类型属性赋值①为List集合类型属性赋值   在Clazz类中添加以下代码:private List students; public List getStudents() { return students; } public void setStudents(List students) { this.students = students; } 复制代码   配置bean: 复制代码   若为Set集合类型属性赋值,只需要将其中的list标签改为set标签即可,同数组一样注入简单类型用value标签,注入其他类型用ref标签。②为Map集合类型属性赋值   创建教师类Teacher:public class Teacher { private Integer teacherId; private String teacherName; public Integer getTeacherId() { return teacherId; } public void setTeacherId(Integer teacherId) { this.teacherId = teacherId; } public String getTeacherName() { return teacherName; } public void setTeacherName(String teacherName) { this.teacherName = teacherName; } public Teacher(Integer teacherId, String teacherName) { this.teacherId = teacherId; this.teacherName = teacherName; } public Teacher() { } @Override public String toString() { return "Teacher{" + "teacherId=" + teacherId + ", teacherName="" + teacherName + """ + "}"; } } 复制代码   在Student类中添加以下代码:private Map teacherMap; public Map getTeacherMap() { return teacherMap; } public void setTeacherMap(Map teacherMap) { this.teacherMap = teacherMap; } 复制代码   配置bean: 抽烟 喝酒 烫头 10010 10086 复制代码   要点:使用标签如果key是简单类型,使用 key 属性,反之使用 key-ref 属性。如果value是简单类型,使用 value 属性,反之使用 value-ref 属性。③注入Properties   java.util.Properties继承java.util.Hashtable,所以Properties也是一个Map集合。它的key和value都是String类型,使用标签嵌套标签完成。 com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/spring root 123456 复制代码3.2.6、p命名空间   引入p命名空间 xmlns:p="www.springframework.org/schema/p"<?xml version="1.0" encoding="UTF-8"?> 复制代码   引入p命名空间后,可以通过以下方式为bean的各个属性赋值,非简单类型需要加ref 复制代码   p命名空间是简化set注入的,所以它基于set方法注入的3.2.7、C命名空间   C命名空间是为了简化构造注入的配置,使用c命名空间需要引入xmlns:c="www.springframework.org/schema/c",并且需要提供构造方法 复制代码3.2.8、util命名空间   Util命名空间的作用是允许配置复用,就是一些相同属性可以提取出来,在需用的地方进行引入。 在使用util命名空间之前,需要先引入xmlns:util="http://www.springframework.org/schema/util"和http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd 需要注意引入的内容和地方。   util命名空间主要是针对集合来使用的,具体就需要看场景需求。   <?xml version="1.0" encoding="UTF-8"?> com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/spring root 123456 复制代码3.2.9、自动装配   Spring还可以完成自动化的注入,自动化注入又被称为自动装配。它可以根据名字进行自动装配,也可以根据类型进行自动装配。public class UserService { private UserDAO userDAO; private UserMysqlDAO userMysqlDAO; public void setDao(UserDAO userDAO) { this.userDAO = userDAO; } public void setUserMysqlDAO(UserMysqlDAO userMysqlDAO) { this.userMysqlDAO = userMysqlDAO; } public void add(){ userDAO.add(); userMysqlDAO.add(); } } 复制代码 复制代码   这个配置起到关键作用:UserService Bean中需要添加autowire="byName",表示通过名称进行装配。UserService类中有一个UserDao属性,而UserDao属性的名字是dao,对应的set方法是setDao() ,正好和UserDao Bean的id是一样的。这就是根据名称自动装配。所以根据名称进行自动装配需要注意的是:提供set方法和bean标签id属性的值   再来看看根据类型进行自动装配,此时需要使用autowire="byType": 复制代码   同理,byType在装配的时候都是基于set方法的。所以set方法是必须要提供的。提供构造方法是不行的,大家可以测试一下。有一点需要注意,根据类型装配时,如果配置文件中有两个类型一样的bean,会抛出异常,所以使用byType时,必须保证注入的bean类型是唯一的。3.2.10、引入外部属性配置文件   我们都知道编写数据源的时候是需要连接数据库的信息的,例如:driver url username password等信息。如果把这些信息单独写到一个属性配置文件中,这样用户修改起来不就会更加的方便嘛。   ①在类路径下新建jdbc.properties文件driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/spring username=root password=root123 复制代码   ②在spring中配置文件里面引入context命名空间   xmlns:context="http://www.springframework.org/schema/context"和http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd   ③使用context命名空间的标签,使用location来指定文件的位置,用${}来获取对应key的值<?xml version="1.0" encoding="UTF-8"?>   链接:https://juejin.cn/post/7212812263097368635


鼓励生孩子,不能没有底线!01hr为了劝人生孩子,各地也是动足了脑筋。有的地方发钱,有的免学费,有的嫌单条措施不够,干脆几条措施一起来最夸张的还数山西省泽州县,直接给二胎三胎家庭发了个超级大礼包,包括1二三广东杜锋停赛1场罚5万,贾昊绊倒马尚并认错,52跟81裁判将被严惩前言杜锋被驱逐受到了名记的批判,贾昊明确发文承认绊倒了马尚布鲁克斯,姚明就要出手惩罚两大裁判了。针对CBA的裁判组,确实应当拿出相应的态度跟措施,一举惩罚一下裁判才行了。针对CBA是时候强推一波河床的贝德兰了!还是挺阳刚的,女友也很美看台上的球迷不惧近40度的高温。不仅从高压水龙喷射出的水丝能带来阵阵惬意,河床9号在绿茵场内的重现更让他们的心情无比舒爽。是蜘蛛侠又回来了吗?真的像啊!尽管在2019年的官网专访中WTT新加坡大满贯王楚钦孙颖莎晋级半决赛北京时间3月14日,2023年世乒联大满贯赛新加坡站进入第四比赛日的争夺。混双14决赛,王楚钦孙颖莎31(7111412117117)战胜对手,晋级半决赛。女双18决赛,陈梦王艺迪前巴萨主席巴托梅乌对裁判们事件给出的理由竟是自保!世界报揭示了巴塞罗那足球俱乐部前主席和前董事在向裁判委员会前副主席何塞玛丽亚恩里克斯内格雷拉付款期间所做的一些信任。让我们为自卫而付出代价,这是私下里做出的信心之一,此外他们还坚持CBA消息杜锋追骂对方球员,贾昊回应惹争议,李楠面临下课危机CBA新消息宏远面临困境,郭昊文有球训练,三分中锋全面下滑近期,广东宏远遭遇多项困难主教练杜锋因冲入场内斥责裁判而被禁赛,球队多名主力球员受伤,备战青岛男篮的比赛成为了一个严峻的考王曼昱有望超越陈梦,刷新世界排名,去年夏天的那个她终于回归新加坡大满贯比赛已近白热化阶段,国乒女队本次表现不佳,两员大将陈梦王艺迪已遭淘汰,但球员的竞技状态有起有伏确属正常,相信她们有机会再度翻盘。与之相反,纵观王曼昱参赛时的整体表现,可谈乒乓球双手持拍打法的健身价值与可行性作者哈尔滨体院孙宝魁随着社会的发展和人们生活水平的不断提高,以及社会心理压力的不断加大,人们越来越渴望多参与一些休闲娱乐,健身的运动项目,以便缓解心理压力强身健体延年益寿。被称为中开始清算!陈戌源新政被叫停,中超缩编势在必行,恒大美梦破灭?中国足协刚刚公示了各级职业联赛完成清欠工作的俱乐部名单,中超的成都蓉城广州城和深圳FC均未完成清欠工作,准入资格存疑。而根据最新消息显示,一家中超南方俱乐部也因为运营资金迟迟无法就秀完纹身秀美甲!吴克群娇喊一发不可收拾爱上美甲了爱美不分性别,一面阳刚一面娇柔爱美之心人皆有之,演艺圈明星更是不分性别!艺人吴克群近期到泰国曼谷旅游,透露自己爱上美甲了,他在社交媒体上放出几张美甲照片,更写下从此一发不可收拾,甚关晓彤又双叒叕翻车?这次土得只剩腿了?hi,小姐妹们晚上好呀,这里是你们爱漂亮的囤囤前两天霸榜的香奈儿2023秋冬大秀你们都看了吗,其实多看看大牌秀场对审美提升也是很有好处的。全程看完直播我只能说不愧是香奈儿相比往年,
老话三餐不合理,健康远离你,一日3餐该咋吃?怎样做最合理老话说三餐不合理,健康远离你,其实这也有一定的科学道理,每日三餐,食物中的蛋白质消化吸收率可以达到85,如果是一日两餐,蛋白质的吸收率就会下降,所以按照我国人民的生活习惯,每日三餐10月1日国庆节将至,家宴美食这样安排,上桌光盘,全家老小爱吃大家好,时间飞速,转眼又将迎来一年一度的国庆节,在假期假期来临之际,你是否已经想好了国庆家宴如何安排呢?推荐安排六道家常菜美食,上桌就光盘,而且特别经济实惠,喜欢的朋友,收藏起来自秋天,吃黄瓜茄子不如吃它,一次多囤些,随吃随取,炒肉吃特香导语秋天,吃黄瓜茄子不如吃它,一次多囤些,随吃随取特省事,炒肉吃特香!人间烟火气,最抚凡人心,柴米油盐最是平凡,简简单单却能温暖疲惫的身体,一日三餐四季,承载着烟火气的美食是最能抚金秋时节,推荐多吃九瓜,润燥滋补,上桌就秒光,身体顶呱呱大家好,这里是邱哥说美食,金秋时节,秋风送爽,大地弥漫着丰收的气息,瓜果蔬菜,五谷作物都获得了丰收,农民伯伯的脸上布满着幸福的笑容。在这个丰收的季节里,我们不仅要收获物质上丰收,还东北50岁大哥,翻出20年前超市海报,一瓶茅台不到300,后悔哭了有人说,近20年间,白酒涨价天翻地覆,你感受到了吗?拿具体例子来说,最近有个东北50多岁的大哥,整理仓库时发现一张2002年的超市海报,这一看不打紧,上面茅五剑的价格按现在来说,简入秋后,吃红薯南瓜不如吃它,现在正当季,营养极高,别不懂吃导语立秋后,遇见这菜别手软!营养极高,全身是宝,一蒸一煮爽滑有嚼劲,大人孩子都爱吃!大家好,我是傻姐美食,生活中唯有美食和美景不可辜负。常言道白露秋风夜,一夜凉一夜。白露过后明显感为什么人类只吃鱼翅,却很少听说吃鲨鱼肉?鲨鱼肉真的不好吃吗?文科学虫洞鱼翅跟燕窝鲍鱼一样,是中国传统的名贵食品。人们捕捞鲨鱼之后,会将鱼翅切割下来,再将鲨鱼放回大海。那么问题来了,鱼翅是鲨鱼的哪个部位?没了鱼翅的鲨鱼,回到大海还能活吗,会不无花果加上雪花梨一起炖煮,还有这效果今天在这里给大家分享一个小茶方法。原材料主要就是雪花梨和无花果,雪花梨和无花果都是这个季节在水果店非常容易买到的两个水果。所以这个小茶方也最适合在这个时节进行饮用。无花果相信大家对才知道,这7种蔬菜焯水后才能吃,幸亏知道得早,赶紧告诉家里人刚刚学会下厨房做饭的那个阶段,好像只会做青椒炒肉丝西红柿炒鸡蛋蛋炒饭红烧鲫鱼排骨藕汤等家常菜,虽然也经常做红烧肉红烧排骨,但始终没有找到制作红烧菜肴的方法和窍门,却学会了焯水,给五被露营爱好者忽视的四川省第二大湖泊,到底有多美?国庆假期,告别人山人海的拥挤,到乡野间露营。用心感受农村的夕阳日落,惬意的田园长桌野餐,篝火与音乐相伴的时光,去和星星与虫鸣作伴。川西的简阳三岔湖是绝佳的秋日露营地,你可以在那里感又降了!柬埔寨飞中国机票价格跌破2000元昨日(9月19日)早上,据泛亚生活读者在群中爆料,称柬埔寨至中国的机票已经降至2026元,该读者还附上了一张图片,这对于着急返回中国的同胞来说是个巨大的福音。因为中国国庆节即将到来