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

Spring整理笔记

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

Spring整理笔记

Spring

简介:

Spring 框架以interface21框架为基础,经过重新设计,并不断丰富其内涵,于2004年3月24日发布。

Rod Johnson ,Spring framework创始人,著名作者,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。

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

以前的框架:

SSH : Struct2+Spring+Hibernate

SSM : SpringMvc + Spring+ Mybatis

官方下载地址:JFrog

GitHub源码:Releases · spring-projects/spring-framework · GitHub

依赖:


    org.springframework
    spring-webmvc
    5.3.13


    org.springframework
    spring-jdbc
    5.3.13

优点:开源免费的框架(容器)、轻量级,非入侵式的框架

特点:控制反转(IOC),面向切面编程(AOP);支持事务处理,对框架整合的支持

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

组成(7大模块)

 

 

Spring Boot

一个快速开发的脚手架,基于SpringBoot可以快速的开发单个微服务

约定大于配置!

Spring Cloud

基于SpringBoot实现的

因为大多数公司都在使用SpringBoot进行快速开发,学习SpringBoot的前提,需要完全掌握Spring及SpringMvc

弊端:配置十分繁琐

IOC理论 inversion of control 控制反转是一种设置思想,获得依赖对象的方式反转了。DI是实现的一种方法

private UserDao userDao=new UserDaoImpl();
private UserDao userDao=new UserDaoMysqlImpl();
private UserDao userDao=new UserDaoOracleImpl();
*****

在传统的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码!如果代码量很大,修改一次的成本代价较高;

我们使用一个Set接口实现,发生了革命性变化

private UserDao userDao;
    //利用set进行动态实现值的注入!
public void setUserDao(UserDao userDao){
     this.userDao=userDao;
}
TEST:
//用户实际调用的是业务层,dao层不需要接触
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoSql());
        userService.getUser();
//我是DaoSql

----之前,程序是主动创建对象,控制权在程序员手上!

----使用set注入后,程序不再具有主动性,而是变成了被动的接受对象。

​ 这种思想,从本质上解决了问题,程序员不用再去管理对象的创建了,系统的耦合性大大降低,可以更加专注的在业务的实现上。这是IOC的原型!

 

IOC是Spring的核心内容,使用多种方式实现了IOC,可以使用XML配置,也可以使用注解,新版本Spring可以零配置实现IOC

Spring容器在初始化的时候先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象。

用XML方式配置Bean的时候,Bean的定义信息是和实现分离的。而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。控制反转是一种通过描述(XML或注解)并通过第三方生产或获取特定对象的方式。在Spring中实现控制反转的是Ioc容器,其实现方法是依赖注入(Dependency Injection,DI)

 

 
    
    

        
​
    

实现了控制反转,对象由Spring来创建,容器相当于这个beans文件。反转:程序本身不创建对象,而变成被动的接收对象。依赖注入:本质就是利用set方法来进行注入,必须有set方法,再设置property即可。

所谓的IOC,就是对象由Spring来创建,管理,装配

public class MyTest {
    public static void main(String[] args) {
        //获取spring的上下文对象  Spring容器
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //我们的对象 现在都在Spring中管理,要使用,直接去里面取出来就可以
        Hello hello =(Hello) context.getBean("hello");
        System.out.println(hello.toString());
    }
}
IOC创建对象的方式

1.默认使用无参构造创建对象


        
    

2.如果要使用有参构造创建对象

1.下标赋值

    
        
    

2.类型匹配 不建议



        
    

3.参数名


        
        
    

 

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了,而且获取到的bean都是单例


Spring配置

1.别名


        
    
    
​
    
​
    
//通过别名也能取到
 User user =(User) context.getBean("123");

2.Bean的配置

    
        
    

3.import

一般用于团队开发,可以将多个配置文件,导入合并为一个总的 applicationContext.xml里面进行import


 

依赖注入

1.构造器注入

2.set方式注入【重点】

依赖注入:Set注入!

依赖:bean对象的创建依赖于容器!

注入:bean对象中的所有属性,由容器来注入!

【环境搭建】

1.复杂类型

public class Address {
    private String address;
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

2.真实测试对象

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

3.beans.xml

?xml version="1.0" encoding="UTF-8"?>



    

对象复杂属性的注入


        
    
    
        
        
        
        
        
        
            
                红楼梦
                西游记
                三国演义
            
        
        
        
            
                game
                run
                study
            
        
        
        
            
                
                
            
        
        
        
            
                LOL
                DOTA
                CS
            
        
        
        
            
        
        
        
            
                20200165
                
                小花
                123456789
            
        
    

address也是对象要toString才能看见,结果为:

 

其他方式注入

支持格式化的配置,p命名空间注入 对应set注入



@Test
    public void test2(){
       ApplicationContext context = new ClassPathXmlApplicationContext("userBeans.xml");
        User user = context.getBean("user",User.class);
        System.out.println(user);
    }

c命名空间注入 对应构造器注入



 

注意:p命名和c命名不能直接使用,需要导入xml约束

xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
bean的作用域

 

1.单例模式(Spring默认机制)

2.原型模式 每次从容器中get的时候,都会产生一个新对象

3.其余的 request 、session 、application 这些只能在web开发中使用

Bean的自动装配

之前我们都是在手动装配,spring可以自动装配,满足bean依赖的一种方式!在上下文中,自动寻找,并自动给bean装配属性!

有三种装配的方式:

1.xml中显示配置

2.java中显示配置

3.隐式的自动装配bean【重要】

ByName自动装配

 
    
    

    
        


    

ByType自动装配

 

    
        
    

小结:

byName的时候,需要保证所有的额bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!

byType的时候,需要保证所有的bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!

使用注解实现自动装配

要使用注解:

1.导入约束 context约束

2.配置注解的支持 context:annotation-config



    
    
​
    
    
    

@Autowired

直接在属性上使用即可!也可以在set方式上使用!

可以不用编写set方法,前提是你这个自动装配的属性在IOC容器中存在,且符合名字byName

public @interface Autowired {
    boolean required() default true;
}
​
//如果显示的定义了Autowired的required属性为false,说明这个对象可以为Null,否则不允许为空
    @Autowired(required = false)
private Cat cat;
  @Autowired
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;
    
    public Cat getCat() {
        return cat;
    }
    public Dog getDog() {
        return dog;
    }
@Nullable 字段标记了这个注解,说明这个字段可以为null;
这样有参构造也可以无参 不会报错
public People(@Nullable String name) {
        this.name=name;
    }

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


    
    
    
    
    @Autowired
    @Qualifier(value = "cat11")
    private Cat cat;
    @Autowired
    @Qualifier(value = "dog22")
    private Dog dog;  

可以用 @Resource 注解 用的较少 功能也强大

    @Resource(name="cat1")
    private Cat cat;
    @Resource
    private Dog dog;
    private String name;

    
    
    
    

小结:

@Resource 和@Autowired的区别:

1.都是用来自动装配的,都可以放在属性字段上

2.@Autowired通过byT方式实现!而且必须要求这个对象存在!

3.@Resource默认通过byName方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况就会报错

使用注解开发

在Spring4之后要使用注解开发 必须要导入aop的包

 

使用注解需要导入context约束,增加注解的支持

1.bean



    
    
   
    
/等价于
//Component 组件
@Component
public class User {
    //相当于 
    // 
    @Value("rose")
    public String name;
}
//Test
   ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = context.getBean("user", User.class);
        System.out.println(user.name);
@Component: 组件,放在类上,说明这个类被Spring管理了,就是bean!


2.属性如何注入 两种方式均可

  //相当于
    // 
    @Value("rose")
    public String name;
    //相当于
    // 
    @Value("rose")
    public void setName(String name) {
        this.name = name;
    }

3.衍生的注解

@Component有几个衍生注解,按照mvc三层架构分层!

dao层:@Repository

service层:@Service

controller层:@Controller

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

4.自动装配

@Autowired :自动装配 通过类型 名字
如果Autowired不能唯一自动装配上属性,则需要通过@Qulifier(value="xxx")
@Nullable 字段标记了这个注解,说明这个字段可以为null
@Resource :自动装配 通过名字 类型

5.作用域

@Component
@Scope("singleton") //原型 prototype
public class User {

6.小结

xml与注解:

xml更加万能,适用于任何场合!维护简单方便

注解 不是自己的类使用不了,维护相对复杂!

最佳实践:xml用来管理bean;注解只负责完成属性的注入

我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持(驱动支持,扫描包里面的注解)


使用java的方式配置Spring

可以完全不使用Spring的xml配置,全权交给java来做 ,javaConfig是Spring的一个子项目,在Spring4之后,它成为了一个核心功能

//这个也会被Spring容器托管,注册到容器中,因为他本来就是一个@Component 代表这是一个配置类
//和之前的beans.xml一样
@Configuration
@ComponentScan("com.xie.pojo")
@import(MyConfig2.class)//导入另外一个配置类 如同xml的import
public class MyConfig {
    //注册一个bean 就相当于我们之前写的一个bean标签
    //这个方法的名字相当于 id
    //这个方法的返回值相当于 class属性
    @Bean
    public User getUser(){
        //返回要注入到bean的对象
        return new User();
    }
}
//实体类
@Component
public class User {
    private String name;
    public String getName() {
        return name;
    }
    //属性注入值
    @Value("测试名")
    public void setName(String name) {
        this.name = name;
    }
  
  
  public class MyTest {
    public static void main(String[] args) {
        //如果完全使用了配置类方式去做,我们只能通过AnnotationConfig上下文来获取容器,通过配置类的class对象加载!
        ApplicationContext context =new AnnotationConfigApplicationContext(MyConfig.class);
        User getUser = (User)context.getBean("getUser");
        System.out.println(getUser.getName());
    }
}

这种纯java的配置方式,在SpringBoot中随处可见!

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

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

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