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

Spring学习

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

Spring学习

目录
  • 1. Spring简介
    • 1.1 Spring理念
    • 1.2 相关网址
    • 1.3 maven依赖
    • 1.4 优点
    • 1.5 组成(了解)
    • 1.6 拓展(了解)
  • 2. IOC理论推导
    • 2.1 IOC原型
    • 2.2 IOC本质
  • 3. 编写代码
    • 3.1 第一个Spring程序
    • 3.2 通过Spring解决2.1中的问题
  • 4. IOC创建对象的方式
  • 5. Spring配置
    • 5.1 别名
    • 5.2 Bean的配置
    • 5.3 import
  • 6. 依赖注入
    • 6.1 构造器注入
    • 6.2 Set方式注入(重要)
    • 6.3 拓展方式注入
    • 6.4 Bean的作用域
      • 6.4.1 单例模式(默认)(singletion )
      • 6.4.2 原型模式(prototype )
  • 7. Bean的自动装配
    • 7.1 测试
    • 7.2 手动装配
    • 7.3 ByName自动装配与ByType自动装配
    • 7.4 使用注解实现自动装配
      • 7.4.1 @Autowired
      • 7.4.2 @Resource
      • 7.4.3 @Resource和@Autowired区别
  • 8. 使用注解开发
    • 8.1 bean
    • 8.2 属性注入
    • 8.3 衍生的注解
    • 8.4 自动装配置(看7.3)
    • 8.5 作用域
    • 8.6 小结

1. Spring简介 1.1 Spring理念

使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架。

1.2 相关网址

官网: https://spring.io/projects/spring-framework#overview.
官方下载地址:https://repo.spring.io/ui/native/release/org/springframework/spring.
GitHub下载: https://github.com/spring-projects/spring-framework.

1.3 maven依赖
    
        org.springframework
        spring-webmvc
        5.2.0.RELEASE
    
    
    
        org.springframework
        spring-jdbc
        5.2.0.RELEASE
    
1.4 优点
  • Spring是一个开源的免费的框架(容器)
  • Spring是一个轻量级的、非入侵式的框架
  • 控制反转(IOC),面向切面编程(AOP)
  • 支持事务的处理,对框架整合的支持

总结: Spring就是一个轻量级的控制反转((IOC)和面向切面编程(AOP)的框架!

1.5 组成(了解)

1.6 拓展(了解)

Spring Boot

  • 一个快速开发的脚手架。
  • 基于SpringBoot可以快速的开发单个微服务
  • 约定大于配置!

Spring Cloud

  • SpringCloud是基于SpringBoot实现的。

Spring弊端:

  • 发展了太久之后,违背了原来的理念,配置十分繁琐,人称:“配置地狱!"
2. IOC理论推导 2.1 IOC原型

比如现在以及已经创建了一个UserDao接口,以及4个不同的实现。
创建了一个UserService接口,以及其实现。

若按照原始的形式,UserServiceImpl基本代码形式为

测试代码为

考虑这么一种问题:当用户不想用UserDaoImpl中的实现了,而是UserDaoMysqlImpl或者UserDaoOracleImpl,那么如果按照这种形式要修改的话就需要修改上述UserServiceImpl中的代码为new UserDapMysqlImpl()。即需要程序员手动去修改源码,这不是我们想看到的。

在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码。如果程序代码量十分大,修改一次的成本代价十分昂贵!
因此对UserServiceImpl做如下修改(使用set注入):

测试代码变为

可以发现,现在若用户不想用UserDaoImpl中的实现了,而是UserDaoMysqlImpl或者UserDaoOracleImpl,只需要将测试代码中的new UserDaoImpl修改为别的对象即可。

通过这种方式,就完成了一个控制权的转换!由原来的程序员转变为了用户! 这种思想,从本质上解决了问题,程序员不用再去管理对象的创建了。系统的耦合性大大降低!程序员可以更加专注的在业务的实现上。

2.2 IOC本质


IOC是一种编程思想,由主动的编程,变成被动的接收。

3. 编写代码 3.1 第一个Spring程序

1.在resources资源文件夹下创建托管对象的.xml文件
注意:该.xml文件,这里先命名为beans.xml了,官方建议命名为:applicationContext.xml。




    
    
        
    

实体类Hello代码为

public class Hello {
    private String str;

    public String getStr() {
        return str;
    }
	 // 必须设置set方法,才能使用bean,相当于它自动帮我们进行set注入
    public void setStr(String str) {
        this.str = str;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + ''' +
                '}';
    }
}

2.使用方法:不用再创建对象,而是去Spring中获取

        // 获取Spring的上下文对象! 参数可以是多个(new CPX快捷获取)
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        // 我们的对象现在都在Spring中管理了,我们要使用的话,直接去里面取出来就可以!
        // 通过在beans.xml中设置的bean的id获得相应的对象
        Hello hello = (Hello) context.getBean("hello");
        // 也可以Hello hello = context.getBean("hello",Hello.class);
        System.out.println(hello.toString());
3.2 通过Spring解决2.1中的问题

在resources下创建beans文件,并编写如下代码

测试代码

也就是说,程序员不用再修改源代码,用户也不用修改源代码,程序代码完全不用动,要实现不同的操作,仅仅改一下xml配置文件就可以了!
所谓IOC,一句话就是:对象由Spring来创建,管理,装配!

4. IOC创建对象的方式

1.使用无参构造创建对象。 默认!
2.假设我们要使用有参构造创建对象

  • 下标赋值
    
    
       
    
  • 类型赋值(若有多个类型一样的属性,就不行了)
    
    
        
    
  • 属性名称赋值(推荐)
    
    
        
    

注意:如果实体类中生成了有参构造函数,但没生成无参构造函数,则需运用constructor-arg 进行注入,若用property会报错(因为有参构造函数会把默认的无参构造函数覆盖掉)。

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!
在测试执行时,在Spring容器中存在的所有对象的无参构造函数都会被执行

5. Spring配置 5.1 别名

取别名之后,相当于多了个名字,之前的名字和别名都可以用

	
    
5.2 Bean的配置

id:bean的唯一标识符,相当于对象名。
class: bean对象对应的全限定名:包名+类名。
name: 也是别名,并且可以取多个别名,空格、逗号、分号都可以用来分隔。

 
     
 
5.3 import

这个import,一般用于团队开发使用,他可以将多个配置文件,导入合并为一个。
假设,现在项目中有多个人开发,这三个人复制不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!
使用的时候,直接使用总的配置就可以了。

6. 依赖注入 6.1 构造器注入 6.2 Set方式注入(重要)

依赖注入:Set注入

  • 依赖: bean对象的创建依赖于容器!
  • 注入: bean对象中的所有属性,由容器来注入!

1.环境搭建
两个类 Student和Address

复杂对象Address

public class Address {
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

真实测试对象Student

public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List hobbys;
    private Map card;
    private Set games;
    private Properties info;
    ...
}

bean.xml中注入数据




    
        
    

    
        
        
        
        
        
        
            
                红楼梦
                西游记
                水浒传
                三国演义
            
        
        
        
            
                听歌
                敲代码
                看电影
            
        
        
        
            
                
                
            
        
        
        
            
                LOL
                COC
                BOB
            
        
        
        
            
        
        
        
            
                
                
                未婚
                
            
        
    


测试代码

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student.toString());
    }
}

输出结果

6.3 拓展方式注入

我们可以使用p命令空间和c命令空间进行注入
p命名空间 和 c命名空间 不能直接使用,要先导入约束。

       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"

例:




    
    

    
    

6.4 Bean的作用域
Scope描述
singletion(默认)为每个Spring IOC容器将单个bean定义的范围限定为单个对象实例。
prototype将单个bean定义的范围限定为任意数量的对象实例。
request将单个bean定义限定为单个HTTP请求的生命周期。也就是说,每个HTTP请求都有自己的bean实例,该实例是在单个bean定义的后面创建的。仅在支持web的Spring ApplicationContext有效。
session将单个bean定义限定为HTTP Session的生命周期在这里插入代码片。仅在支持web的Spring ApplicationContext 有效。
application将单个bean定义限定到ServletContext的生命周期。仅在支持web的Spring ApplicationContext
websocket将单个bean定义的范围限定到WebSocket的生命周期。仅在支持web的Spring ApplicationContext的上下文中有效。
6.4.1 单例模式(默认)(singletion )

每次从容器中get的时候,都会得到同一个对象!

    
    
6.4.2 原型模式(prototype )

每次从容器中get的时候,都会产生一个新对象!

    
    

其他的作用域只在web开发中才能用到!

7. Bean的自动装配

自动装配是Spring满足bean依赖一种方式!
Spring会在上下文中自动寻找,并自动给bean装配属性!

在Spring中有三种装配的方式:

  • 在xmI中显示的配置
  • 在java中显示配置
  • 隐式的自动装配bean [重要]
7.1 测试

一个People有两个宠物Cat和Dog

7.2 手动装配
    
    
    
    
        
        
        
    
7.3 ByName自动装配与ByType自动装配

接下来使用自动装配(在bean中添加autowire=" ")
byName: 会自动在容器上下文中查找和自己对象set方法后面的值对应的bean的id。

    
    
    
    
        
    

byType: 会自动在容器上下文中查找,和自己对象属性类型相同的bean。

    
    
    
    
        
    

但必须保证类型(bean的class)唯一,否则报错

小结:

  • byName的时候,需要保证这个bean的id和自动注入的属性的set方法的值一致。
  • byType的时候,需要保证bean的class唯一,并且这个bean和自动注入的类型一致。
7.4 使用注解实现自动装配

要使用注解须知:(第四、七、八、十行是新增)(重要)

  • 导入约束:context约束
  • 配置注解的支持: (重要)


	
    


在java中显示配置

7.4.1 @Autowired

直接在属性上使用即可!也可以在set方法上使用!
使用Autowired后我们可以不用编写set方法了,前提是这个自动装配的属性在IOC(Spring)容器中存在,并且符合名字byName(先byType再ByName)


测试代码为

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        People people = context.getBean("people", People.class);
        people.getCat().shout();
        people.getDog().shout();
    }
}

由于是先按照byType,如果类型唯一,就算id不对应,也能正确输出结果。但如果类型不唯一,则会进一步去找与属性相同的id,若找到则正确输出结果,找不到则报错!

扩展: 如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以使用@Qualifier(value=“xxx”)去配置,指定一个唯一的bean对象注入!

7.4.2 @Resource

也是直接在属性上使用即可!但它寻找的方式是先byName再ByType。即只要找到id对应的,就算有多个类型,也会输出正确结果。而且如果未找到id对应的,则去找类型,若类型唯一,则输出正确结果,反之报错!

同理,Resource也可以指定唯一的名称

7.4.3 @Resource和@Autowired区别
  1. 都是用来自动装配的,都可以放在属性字段上
  2. @ Autowired通过byType的方式实现,而且必须要求这个对象存在!(常用)
  3. @Resource默认通过byName的方式实现,如果找不到名字,则通过byType实现!如果都找不到或者id找不到且Type不唯一的情况就报错!
  4. 执行顺序不同: @ Autowired默认通过byType的方式实现。@Resource默认通过byName的方式实现。
8. 使用注解开发

在Spring4之后,要使用注解开发,必须要保证aop的包导入了。(webmvc依赖已经包含了aop)

8.1 bean

先写入配置文件
添加这一句,指定要扫描的包,这个包下的注解就会生效:

 
 


    
    
    
    
    

8.2 属性注入
// 等价于
@Component
public class User {
    // 相当于 
    @Value("刘梦豪")  // 该注解可以放到set方法上,也可以放到属性上
    public String name;
}
8.3 衍生的注解

@Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层!

  • dao 用到的注解为:[@Repository]
  • service 用到的注解为:[ @Service]
  • controller 用到的注解为:[@Controller]

这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean

8.4 自动装配置(看7.3)

在7.4中已经提到了
@Resource和@Autowired

8.5 作用域

@Scope(value=" ")
如下设置为 原型模式

8.6 小结

xml与注解:

  • xml 更加万能,适合任何场合!维护简单方便
  • 注解的话若不是自己的类则使用不了!维护相对复杂

xml与注解最佳实践:

  • xml用来管理bean;
  • 注解只负责完成属性的注入;
  • 我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/462133.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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