栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring学习记录

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring学习记录

Spring介绍:

1、耦合(Coupling)

2、内聚(Cohesion)

高低聚低耦合

一、快速入门 1、添加spring 依赖(pom.xml)文件中。
org.springframework
    spring-context
    5.3.12

2、添加配置文件 applicationContext.xml 文件



    


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属性要
    
          //一个bean里面可以有多个property.ref就是要注入资源的bean的id.name就是set方法中[setXxx(Xxx首字母小写)],xxx.
    
    //3、将要注入的资源声明为bean(如果是是字符串或者非引用类型不需要此步骤)
    


方法二 构造函数注入

引用类型使用ref,非引用类型使用value

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进行注入


    //注入ArrayList
    
        
            lvmanba
            66666
        
    
    //注入properties
    
        
            lmb123
            456
        
    
    //注入数组
    
        
            456
            7890
        
    
    //注入HashSet
    
        
            lmb456
            7890
        
    
    //注入HashMap
    
        
            
            
        
    

4、property标签的简化(p命名空间来用简化书写)

加入: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来表示。


    
    
    
    

六、Spring中properties文件的导入

1、准备外部properties文件

2、在Spring的配置文件中,开启context命名空间支持

xmls:context=“http://www.springframework.org/schema/context”

xsi:schemaLocation=“… http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd"

3、加载制定的properties文件

4、使用加载的数据

和EL的使用的符号不一样,要使用$,而不是#

注意:如果需要加载所有的properties文件,可以使用*.properties表示加载所有的properties文件

读取数据使用${propertiesName}格式进行,其中propertiesName指properties文件中的属性名。




    

    
        
        
        
          //3、使用xml中的变量
    
七、简化配置文件(applicationContext.xml),分块管理

我们在实际开发的过程中,配置文件会越来越多,这样维护起来就很麻烦,我们根据模块进行分类,然后在导入到总的配置文件中。

总配置: 这里导入两个,一个是user的,另外一个是book

applicationContext.xml



    
    
    


applicationContext-book.xml



    
        
            
                lvmanba
                66666
            
        
        
            
                lmb123
                456
            
        
    


applicationContext-user.xml



    
        
        
        
        
    
    


如果在模块中有相同的变量名,那么通过import导入以后,后进的覆盖先进的。 八、整合第三方资源

1、在maven中pom.xml中添加依赖


    com.alibaba
    druid
    1.2.0

2、在spring配置文件中添加bean


    
    
    
    

3、在入口文件出引用使用

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);
    }
}

“root” />

3、在入口文件出引用使用

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);
}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356624.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号