Spring介绍:
1、耦合(Coupling)
2、内聚(Cohesion)
高低聚低耦合
一、快速入门 1、添加spring 依赖(pom.xml)文件中。2、添加配置文件 applicationContext.xml 文件org.springframework spring-context5.3.12
3、使用
//2、加载配置文件,使用spring的ClassPathXmlApplicationContext
ApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml");
//3、获取资源
//UserService userService = (UserService) ctx.getBean("userService");
UserService userService = (UserService) ctx.getBean("us");
userService.save();
二、IoC(控制反转)配置(8大属性):
IoC: (Inversion Of Control) 控制反转,Spring反向控制应用程序所需要使用的外部资源。
名称:bean,归属:beans标签
作用:定义spring中的资源,受次标签定义的资源受到spring控制。
格式:
1、id:bean的名称,通过id值获取bean (可选,和name必须存在一个)
2、class:bean的类型(全路径)(必须)
3、name:bean的名称,也可以通过name值获取bean.(可选,和id必须存在一个)
4、bean的scope属性:定义bean的作用范围(可选,默认的属性是singleton)
-取值说明:
-singleton: 设定创建的对象保存在spring容器中,是一个单例的对象。默认情况下 ,是单例.
-prototype:设定创建的对象保存在spring容器中,是一个非单例的对象。
-request、session、application、websocket:设定创建出的对象放置在web容器对应的位置。
5、bean的生命周期标签:init-method(初始化),destroy-method(销毁).( 可选)
值对应类的方法名.
- 当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次
- 当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次
- 当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次
- 当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行
如果以前做的工厂类的程序想使用spring:如果方法如下:需要用到factory-method、factory-bean
静态工厂:
实例工厂:需要使用两个
(factory-bean和上面定义的id要相同)
三、DI、依赖注入DI(Dependency Injection) 依赖注入,应用程序运行依赖的资源由Spring为其提供,资源进入应用程序的方式称为注入。
IoC和Di:同一件事务,通过不同角度去描述。
依赖注入有2种方式:(解决为bean提供资源) 方法1:set注入使用格式:名称为property,归属bean标签,使用set方式为bean提供资源。
引用类型使用ref,其他类型都使用value,二者不能同时使用
name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称) value:设定非引用类型属性对应的值,不能与ref同时使用。 ref:设定引用类型属性对应bean的id ,不能与value同时使用
实例:如果service中的UserServiceIpml.java中想使用dao中的UserDaoImpl.java, 那就是要在UserServiceIpml.java注入UserDaoImpl, 我们传统的方法是UserServiceIpml.java中创建对象,然后使用,如果使用注入那么先要做两件事,第一是:定义一个要引入对象的私有变量,第二创建该变量的set方法。
public class UserServiceIpml implements UserService {
private UserDao userDao; // 1、创建userDao变量(引用类型变量)
public void setUserDao(UserDao userDao) {//2、创建该变量的set方法。
this.userDao = userDao;
}
public void save() {
userDao.save();
System.out.println("user service is runing!");
}
}
第三步: 设置配置文件
方法二 构造函数注入//4、将要注入的引用类型的变量通过property属性注入,对应的name是要注入的变量,使用ref属性要 //3、将要注入的资源声明为bean(如果是是字符串或者非引用类型不需要此步骤) //一个bean里面可以有多个property.ref就是要注入资源的bean的id.name就是set方法中[setXxx(Xxx首字母小写)],xxx.
name 对应构造函数所携带的参数名。
要set方法不同的时候,不需要set方法了,而是通过构造函数来实现。
public class UserServiceIpml implements UserService {
//1、声明变量
private UserDao userDao;
private int num;
private String str;
//2、创建构造方法
public UserServiceIpml(UserDao userDao,int num,String str){
this.userDao = userDao;
this.num = num;
this.str = str;
}
public void save() {
userDao.save();
System.out.println("user service is runing!"+str+" "+num);
}
}
配置文件
如果在constructor-arg 不加name,那么constructor-arg的顺序就自动和构造函数的顺序匹配。这样很容易出现错误,也可以使用index属性,index顺序就对应的构造函数的参数的顺序。也很麻烦,还是建议使用name来对应。
3、注入集合类型的数据要注入的类中的所有属性都需要分别注入,如果是引用变量,还需要讲引用变量的所对应的类以及类中的属性也需要进行注入,也就是说只要提交给spring,其所有的属性的实现(既都需要交给spring)。
集合类型的数据注入:array,list,set,map,props, 归属property标签或者constructor-arg标签
格式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FaGrtam6-1635406396766)(C:UsersAdministratorDesktopimgsimage-20211027091904251.png)]
还需要对applicationContent.xml中进行将提交给Spring
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxJl28qz-1635406396769)(C:UsersAdministratorDesktopimgsimage-20211027114132374.png)]
bookDaoImpl中已经有自己的属性。也需要通过property进行注入
4、property标签的简化(p命名空间来用简化书写)//注入ArrayList //注入properties
lvmanba 66666 //注入数组 lmb123 456 //注入HashSet 456 7890 //注入HashMap lmb456 7890
加入:xmlns:p=“http://www.springframework.org/schema/p” 到第三行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WRg4GtOn-1635406396772)(C:UsersAdministratorDesktopimgsimage-20211027162122108.png)]
然后在标签中直接书写,以引用类型为例:
上面的代码使用p标签替换以后为:
id=“userService” name=“us” class=“com.lvmanba.service.ipml.UserServiceIpml” p:userDao-ref=“userDao” p:bookDao-ref=“bookDao” /> 格式: p:set后面的名称首字母小写-ref=“目标bean的id” 5、SpEL(了解) 作用:Spring提供了对EL表达式的支持,统一属性注入格式。 格式 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JFReGUEC-1635406396774)(C:UsersAdministratorDesktopimgsimage-20211027164204733.png)] 以下面代码为例: 使用EL以后,不在使用ref,都使用value来表示。 1、准备外部properties文件 2、在Spring的配置文件中,开启context命名空间支持 xmls:context=“http://www.springframework.org/schema/context” xsi:schemaLocation=“… http://www.springframework.org/schema/context 3、加载制定的properties文件 4、使用加载的数据 和EL的使用的符号不一样,要使用$,而不是# 注意:如果需要加载所有的properties文件,可以使用*.properties表示加载所有的properties文件 读取数据使用${propertiesName}格式进行,其中propertiesName指properties文件中的属性名。 我们在实际开发的过程中,配置文件会越来越多,这样维护起来就很麻烦,我们根据模块进行分类,然后在导入到总的配置文件中。 总配置: 这里导入两个,一个是user的,另外一个是book applicationContext-user.xml 1、在maven中pom.xml中添加依赖 2、在spring配置文件中添加bean 3、在入口文件出引用使用 “root” /> public class UserApp {
六、Spring中properties文件的导入
https://www.springframework.org/schema/context/spring-context.xsd"
七、简化配置文件(applicationContext.xml),分块管理
applicationContext-book.xml
如果在模块中有相同的变量名,那么通过import导入以后,后进的覆盖先进的。
八、整合第三方资源
public class UserApp {
public static void main(String[] args) throws Exception {
//2、加载配置文件,使用spring的ClassPathXmlApplicationContext
ApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml");
//3、获取资源
DruidDataSource dataSource = (DruidDataSource) ctx.getBean("dataSource");
System.out.println(dataSource);
}
}
3、在入口文件出引用使用
public static void main(String[] args) throws Exception {
//2、加载配置文件,使用spring的ClassPathXmlApplicationContext
ApplicationContext ctx= new ClassPathXmlApplicationContext(“applicationContext.xml”);
//3、获取资源
DruidDataSource dataSource = (DruidDataSource) ctx.getBean(“dataSource”);
System.out.println(dataSource);
}
}



