Spring系列之 配置文件的操作
写在文章前面:
本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升
Spring配置文件的作用
Spring配置文件是用于Spring工厂进行Bean生产,依赖关系注入,Bean实例分发的图纸,他类似于人类的大脑,我们必须掌握这张图纸的使用方法,才能进行相关的操作,灵活运用这张图纸准确的表达自己的意图。运筹帷幄,决胜千里。Spring的配置文件是一个或多个标准的未使用Spring前程序的开发步骤
这里以配置一个User类为例,UserImp为接口,User为其实现类,我们本来使用一个 UserImp接口去接收一个User的实现对象,本来是通过以下代码:
UserImp user=new User()流程图:

使用上述方法的缺点:代码的耦合度过高
使用Spring框架操作
这里以配置一个User类为例,UserImp为接口,User为其实现类,我们使用一个 UserImp接口去接受一个User的实现对象,代码如下:
UserDao user=Spring客户端.getBean(id标识符)那么其内部的原理是怎么样的呢?要实现解耦,基本上都是使用配置文的方式,Spring自然也不例外,下面通过一张流程图解来带领大家更好的领会
流程图解:

Spring入门实现步骤
1.在pom.2.创建Bean
3.创建applicationContext.4.在5.创建ApplicationContext对象getBean
实现一个简单的Spring案例
项目结构:
主函数,使用Spring的API获取Bean实例
存在的文件夹:
package com.pjh.Dao.Demo;import com.pjh.Dao.UserDaoImp.UserDaoImp;import org.springframework.context.support.ClassPath创建Spring的配置文件:applicationContext.存在的文件夹:
代码:
<?导入Spring开发的基本坐标,在pom.
文件位置
代码:
编写userDaoImp类的相关信息:
package com.pjh.Dao.UserDaoImp;import com.pjh.Dao.UserDao;public class UserDaoImp implements UserDao{ public void save() { System.out.println("save runing!!"); }}运行结果
成功执行
Bean标签介绍与基本属性
3.1 Bean标签的基本配置
用于配置文件交由Spring配置,默认调用无参构造,如果没有无参构造则创建失败
id:Bean实例在Spring中的唯一标识符
class:Bean实例的全限定名称
如果你在某个实现类中复写了有参构造,记得添加无参构造方法,因为你复写了有参构造后,原本的无参构造会消除掉,如果你在这个时候仍然在Spring的配置文件中默认使用无参构造,那么这时候他就会报错
如图
3.2Bean的标签范围配置

这里讲解一下singleton(单例的)和prototype(多例的)
当scope取值为singleton时:
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心配置文件被加载时
Bean的生命周期:
对象创建:当应用加载时对象创建
对象运行:只要容器在,对象就一直活着
对象销毁:当应用卸载,容器销毁时
示例
配置文件信息
<?主函数代码,使用Spring的API创建两个Bean对象:
package com.pjh.Dao.Demo;import com.pjh.Dao.UserDaoImp.UserDaoImp;import org.springframework.context.support.ClassPath运行结果:
两个对象的地址值一样,说明为同一个对象
当scope取值为prototype时:
Bean的实例化格式:多个
Bean的实例化时机:当调用getBean()方法时,实例化Bean
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,对象就一直存在
对象销毁:对象长时间不使用,就会被java的垃圾回收机制回收
示例
配置文件信息
<?主函数代码,使用Spring的API创建两个Bean对象:
package com.pjh.Dao.Demo;import com.pjh.Dao.UserDaoImp.UserDaoImp;import org.springframework.context.support.ClassPath运行结果:
两个对象的地址值不一样,说明为不对象

3.3Bean的生命周期配置
init-method:指定类中的初始化方法
destroy-method:指定类中的销毁方法
使用这两个方法我们可以佐证一下上面所说的Bea对象的创建时机:
编写spring核心配置文件的信息
scope为:prototype(双例)
<?编写userDaoImp的相关配置文件信息
package com.pjh.Dao.Demo;import com.pjh.Dao.UserDaoImp.UserDaoImp;import org.springframework.context.support.ClassPath运行结果:
构造方法被调用了两次,说明创建了两个对象
方法被调用的次序:构造方法->初始化方法
scope为:prototype(单例)
配置文件代码
<?主函数
package com.pjh.Dao.Demo;import com.pjh.Dao.UserDaoImp.UserDaoImp;import org.springframework.context.support.ClassPath运行结果
构造方法与初始化方法均只被调用了一次,故为同一个对象

**
Bean实例化的三种方式
**
1.使用无参构造实例化
他会根据默认无参构造来创建实例化对象,没有无参构造的方法这里会报错,这点我们在上面已经说的很清楚了
<bean id="userDaoImp" class="com.pjh.Dao.UserDaoImp.UserDaoImp" ></bean>2.工厂静态方法实例化
工厂的静态方法返回实例化对象
package com.pjh.Dao.factory;import com.pjh.Dao.UserDaoImp.UserDaoImp;public class factory { public static UserDaoImp getUserDaoImp(){ return new UserDaoImp(); }} <bean id="factory" class="com.pjh.Dao.factory.factory" factory-method="getUserDaoImp"></bean>3.工厂实例方法实例实例化
工厂的非静态方法放回Bean实例
package com.pjh.Dao.factory;import com.pjh.Dao.UserDaoImp.UserDaoImp;public class factory { public UserDaoImp getUserDaoImp(){ return new UserDaoImp(); }}配置文件的代码
<bean id="factory" class="com.pjh.Dao.factory.factory" ></bean> <bean id="userDao" factory-bean="factory" factory-method="getUserDaoImp"></bean>依赖注入
依赖注入是Spring框架核心IOC的具体实现,其本质是通过控制反转,把创建对象的操作交给Spring来实现,但是代码中不可能出现没有依赖的情况,IOC解耦只是降低他们之间的耦合性,并不会完全消除依赖,例如:业务层仍然调用持久层的方法,只是这种业务层和持久层的依赖关系,在使用Spring之后,交给Spring来管理,简单的来说就是让框架来完成持久层传入业务层的操作。
下面通过userServic类内部使用userDaoImp类来讲述依赖注入的相关操作
userDaoImp代码
package com.pjh.Dao.UserDaoImp;import com.pjh.Dao.UserDao;public class UserDaoImp implements UserDao{ public void save() { System.out.println("save runing!!"); }}userService代码
package com.pjh.Dao.service;import com.pjh.Dao.UserDao;import com.pjh.Dao.UserDaoImp.UserDaoImp;import org.springframework.context.support.ClassPathSpring的配置文件:
将userService和userDao的创建权交给Spring
<bean id="userDao" class="com.pjh.Dao.UserDaoImp.UserDaoImp"></bean><bean id="userService" class="com.pjh.Dao.service.userService"></bean>主函数代码
从容器中获取userService进行操作
package com.pjh.Dao.Demo;import com.pjh.Dao.UserDaoImp.UserDaoImp;import org.springframework.context.support.ClassPath对上述案例的依赖注入的分析
当前做法是在容器的外部获取userImp和userDao来在程序中进行结合
最终的目的:
因为UserService和UserDao都在Sprin容器内部,所以可以在Spring容器中,将UserDao设置到userService内部
那么我们应该如何操作才能在配置文件将UserDao设置到userService内部呢?这无外乎就是使用1.set方法2.构造方两种方式,下面我们来逐一讲解
**
1.set方法注入
**
在Userservice中添加setUserDa方法
package com.pjh.Dao.service;import com.pjh.Dao.UserDao;public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void save(){ userDao.save(); }}在Spring容器中调用set方法经行注入
配置配置文件的方法1
<?配置配置文件的方2
使用P命名空间,其本质上也是set注入,不过比上面的方法更加简单,体现在配置文件中
首先我们要先引入P命名空间
<bean id="userService" class="com.pjh.Dao.service.UserService" p:userDao-ref="userDao">整个配置文件
<?这里的name和ref虽然是同名的,但是name指userDao是UserService中的参数,UserService中有一个UserDao类型的名叫userDao的参数,ref则是当前的这个
2.使用构造方法进行注入
方法1
创建有参构造即可
package com.pjh.Dao.service;import com.pjh.Dao.UserDao;import org.springframework.context.support.ClassPath方法二
配置Spring容器调用有参构造时经行注入
首先要在UserService中设置有参构造
package com.pjh.Dao.service;import com.pjh.Dao.UserDao;public class UserService { private UserDao userDao; public UserService(UserDao userDao) { this.userDao = userDao; } public void save(){ //调用save方法 userDao.save(); }}其次要更改Spring配置文件中的代码
<?这里的name和ref虽然是同名的,但是name指userDao是UserService中的参数,UserService中有一个UserDao类型的名叫userDao的参数,ref则是当前的这个
<bean id="userService" class="com.pjh.Dao.service.UserService" > <constructor-arg name="userDao" ref="userDao"></constructor-arg>**
普通数据类型和集合的注入
**
上面的数据类型都是注入的引用Bean,除了引用数据类型,集合,普通数据类型等都可以进行注入
注入的三种数据类型
普通数据类型
引用数据类型
集合数据类型
引用数据类型我们在上面已经叙述过了,接下来我们来讲讲普通数据类型和集合的注入
普通数据类型和集合
1.普通数据类型注入
示例:往UserDaoImp类中注入age 与name
package com.pjh.Dao.UserDaoImp;import com.pjh.Dao.UserDao;public class UserDaoImp implements UserDao{ private int age; private String name; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void save() { System.out.println(name+":"+age); }}spring配置文件中的代码
<?2.集合数据类型List
示例:往UserDaoImp类中注入intlist
package com.pjh.Dao.UserDaoImp;import com.pjh.Dao.UserDao;import java.util.List;public class UserDaoImp implements UserDao{ private List<Integer> intlist; public void setIntlist(List<Integer> intlist) { this.intlist = intlist; } public void save() { System.out.println(intlist); }}Spring的配置文件代码
<?3.集合数据类型List<引用数据类型> 注入
这里的引用数据类型我用一个简单的User类代替,user类代码如下
package com.pjh.Dao.UserDaoImp;public class User { private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "age=" + age + ", name='" + name + '\'' + '}'; }}UserDaoImp中的代码
package com.pjh.Dao.UserDaoImp;import com.pjh.Dao.UserDao;import java.util.List;public class UserDaoImp implements UserDao{ private List<User> userslist; public void setUserslist(List<User> userslist) { this.userslist = userslist; } public void save() { System.out.println(userslist); }}Spring核心配置文件中的代码
<!--核心配置部分--> <!--创建第一个bean对象--> <bean id="user1" class="com.pjh.Dao.UserDaoImp.User"> <property name="name" value="zhangsna"></property> <property name="age" value="1"></property> </bean> <!--创建第二个bean对象--> <bean id="user2" class="com.pjh.Dao.UserDaoImp.User"> <property name="name" value="lisi"></property> <property name="age" value="2"></property> </bean> <bean id="userDao" class="com.pjh.Dao.UserDaoImp.UserDaoImp"> <!--注入集合--> <property name="userslist"> <list> <ref bean="user1"></ref> <ref bean="user2"></ref> </list> </property> </bean>4.集合数据类型 Map<String,引用数据类型>的注入
这里的引用数据类型我用一个简单的User类代替,user类代码如下
package com.pjh.Dao.UserDaoImp;public class User { private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User{" + "age=" + age + ", name='" + name + '\'' + '}'; }}UserDaoImp中的代码
package com.pjh.Dao.UserDaoImp;import com.pjh.Dao.UserDao;import java.util.Map;public class UserDaoImp implements UserDao{ private Map<String,User> usersMap; public void setUsersMap(Map<String, User> usersMap) { this.usersMap = usersMap; } public void save() { System.out.println(usersMap); }}Spring配置文件中的代码
<!--核心配置部分--> <!--创建第一个bean对象--> <bean id="user1" class="com.pjh.Dao.UserDaoImp.User"> <property name="name" value="zhangsna"></property> <property name="age" value="1"></property> </bean> <!--创建第二个bean对象--> <bean id="user2" class="com.pjh.Dao.UserDaoImp.User"> <property name="name" value="lisi"></property> <property name="age" value="2"></property> </bean> <bean id="userDao" class="com.pjh.Dao.UserDaoImp.UserDaoImp"> <!--注入集合--> <property name="usersMap"> <map> <entry key="user1" value-ref="user1"></entry> <entry key="user2" value-ref="user2"></entry> </map> </property> </bean>5.集合数据类型Properties的注入
UserDaoImp中的代码
package com.pjh.Dao.UserDaoImp;import com.pjh.Dao.UserDao;import java.util.Map;import java.util.Properties;public class UserDaoImp implements UserDao{ private Properties properties; public void setProperties(Properties properties) { this.properties = properties; } public void save() { System.out.println(properties); }}Spring配置文件中的代码
<!--核心配置部分--> <!--创建第一个bean对象--> <bean id="user1" class="com.pjh.Dao.UserDaoImp.User"> <property name="name" value="zhangsna"></property> <property name="age" value="1"></property> </bean> <!--创建第二个bean对象--> <bean id="user2" class="com.pjh.Dao.UserDaoImp.User"> <property name="name" value="lisi"></property> <property name="age" value="2"></property> </bean> <bean id="userDao" class="com.pjh.Dao.UserDaoImp.UserDaoImp"> <!--注入集合--> <property name="properties"> <props> <prop key="user1">aaa</prop> <prop key="user2">bbb</prop> </props> </property> </bean>引入其他配置文件(分模块开发)
我们的上面的只是一个小案例所以只用了一个配置文件,但是我们以后如果开发一个大项目的时候,spring的配置文件很繁杂而且体积大,我们可以将配置文件按照一个个开发模块拆解到其他的配置文件中,这样利于我们的管理,在spring的主配置文件中通过import进行加载
<import resource="applicationContext-xxx.配置文件标签的小总结
<bean>标签 id属性:在容器中Bean实例的唯一标识,不允许重复 class属性:要实例化的Bean的全限定名 scope属性:Bean的作用范围,常用是Singleton(默认)和prototype <property>标签:属性注入 name属性:属性名称 value属性:注入的普通属性值 ref属性:注入的对象引用值 <list>标签 <map>标签 <properties>标签 <constructor-arg>标签<import>标签:导入其他的Spring的分文件ApplicationContext的继承体
applicationContext:接口类型,代表应用上下文,通过其实例获得Spring容器中的Bean对象

Applicationj的实现类
1)ClassPath以上就是Spring配置文件的详细教程,写了好几个小时,属实不易,在肝文过程中也碰到了许多错误,也都一一修正,文章也尽量使用图文的形式来呈现,利于读者理解,肝作不易,觉得有帮助的还请点赞关注,我会给大家带来更多的文章,知识点

跨境电商站外引流技巧分享、 海外仓红利还剩多少·掘金欧美海外仓、 2017首届跨境电商实操干货跨年千人盛会、 亚马逊每月利润计算报表模板、 亚马逊无货源是什么路数?影响其成败的因素你知道吗?、 跨境电商ERP安全吗?各大跨境电商ERP功能对比!、 店铺规则及工具的应用、 (精品分析)亚马逊美国站USB转接头类目市场调查数据报告、 netporter、 问题解读-亚马逊常见问题大解析、 运营技能、 TinyPic、 美将对华3000亿美元商品加征10%关税 / 亚马逊法国站佣金将上涨、 重要原因揭秘:这些卖家凭什么能月入5w?、 晚点独家 | TikTok 的美国老板走了,两封内部信都说了什么?、 降降降!亚欧海运费再次下降,船公司将上调费率!、
没有评论:
发表评论
注意:只有此博客的成员才能发布评论。