狂神说JavaSpring详解

Posted 闲言_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了狂神说JavaSpring详解相关的知识,希望对你有一定的参考价值。

目录

狂神视频地址

https://www.bilibili.com/video/BV1WE411d7Dv?p=3


1、Spring

1-1.Spring 简介

Spring:春天------>给软件行业带来了春天!

2002,首次推出了Spring框架的雏形:interface21框架!

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

Rod Johnson,Spring Framework创始人,著名作者。很难想象Rod Johnson的学历,真的让好多人大吃一惊,他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学

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


1-2.Spring 的优点

  1. Spring是一个开源的免费的框架(容器)!
  2. Spring是一个轻量级的、非入侵式的框架!
  3. 控制反转(IOC),面向切面编程(AOP)!
  4. 支持事务的处理,对框架整合的支持!

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


1-3.Spring 组成


1-4.Spring 拓展

现代化的Java开发说白就是基于Spring的开发!

Spring Boot

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

Spring Cloud

  1. SpringCloud是基于SpringBoot实现的。
  2. 因为现在大多数公司都在使用SpringBoot进行快速开发,学习SpringBoot的前提,需要完全掌握Spring及SpringMVC!承上启下的作用!

弊端:发展了太久之后,违背了原来的理念!配置十分繁琐,人称:“配置地狱!”


2、IOC理论推导

2-1.UserDao 接口

public interface UserDao 

    void getUser();


2-2.UserDaoImpl 实现类

public class UserDaoImpl implements UserDao 

    public void getUser() 
        System.out.println("获取用户数据");
    

2-3.UserService 业务接口

public interface UserService 

    void getUser();

2-4.UserServiceImpl 业务实现类

public class UserServiceImpl implements UserService 

    UserDao userDao = new UserDaoImpl();

    public void getUser() 
      userDao.getUser();
    

2-5.测试

public class Test 
    public static void main(String[] args) 

        UserService userService = new UserServiceImpl();
        userService.getUser();

    

  在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量十分大,修改一次的成本代价十分昂贵!

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

UserDao userDao;

public void setUserDao(UserDao userDao)
    this.userDao = userDao;

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

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

控制反转了,主动权交给用户了

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


3、IOC本质

  控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了

  采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

  控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。


4、Spring 入门程序

4-1.实体类

public class User 
    private String name;

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    @Override
    public String toString() 
        return "User" +
                "name='" + name + '\\'' +
                '';
    

4-2.配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--使用Spring 来创建对象,在Spring 中,这些都称为bean
    类型  变量名 = new 类型();
    User user = new User();

        bean = 对象 new User();
    id = 变量名
    class = new 的对象;
    property 相当于 给对象中的属性设置一个值!

    -->
    <bean id="user" class="cn.bloghut.domain.User">
            <property name="name" value="csdn_闲言"/>
    </bean>

</beans>

4-3.测试

public static void main(String[] args) 
    //获取Spring 的上下文对象
    ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
    //我们的对象现在都在Spring 中管理了,我们要使用,直接去里面取出来就行了
    User user = (User)ac.getBean("user");
    //打印
    System.out.println(user.toString());

4-4.结果

Username='闲言'

4-5.思考问题?

Hello对象是谁创建的?

  Hello对象是由Spring创建的

Hello对象的属性是怎么设置的?
  Hello对象的属性是由Spring容器设置的

这个过程就叫控制反转

  控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。

  反转:程序本身不创建对象,而变成被动的接收对象。

依赖注入:就是利用set方法来进行注入的

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

可以通过new ClassPathXmlApplicationContext去浏览一下底层源码。

到了现在,不用在程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IOC,一句话搞定:对象由Spring来创建,管理,装配


5、IOC创建对象的方式

5-1.使用无参构造创建对象,默认!

public User() 
    System.out.println("User 空参构造方法执行了");


<!--注入user-->
<bean id="user" class="cn.bloghut.pojo.User">
    <property name="name" value="csdn_闲言"/>
</bean>

5-2.使用有参构造创建对象

下标赋值

public User(String name) 
    this.name = name;


<bean id="user" class="cn.bloghut.pojo.User">
    <constructor-arg index="0" value="csdn_闲言"/>
</bean>

5-3.类型

public User(String name) 
    this.name = name;

<!--通过类型-->
<bean id="user" class="cn.bloghut.pojo.User">
    <constructor-arg type="java.lang.String" value="csdn_闲言"/>
</bean>

参数名
<!--参数名-->
<bean id="user" class="cn.bloghut.pojo.User">
    <constructor-arg name="name" value="csnd_闲言"/>
</bean>

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!

Spring 容器,就类似于婚介网站。

  • 信息都注册在里面
  • 你想查看(获取)的时候再拿

6、Spring配置

6-1.别名

<bean id="user" class="cn.bloghut.pojo.User">
    <constructor-arg name="name" value="csnd_闲言"/>
</bean>
<alias name="user" alias="user2"/>

ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
User user = (User)ac.getBean("user2");
user.show();

输出:csnd_闲言

6-2.Bean的配置

别名可以通过很多种方式分割

空格分割
逗号分割
分号分割
<bean id="user" class="cn.bloghut.pojo.User" name="user2 u2,u3;u4">
    <property name="name" value="csdn_闲言"/>
</bean>

//        User user = (User)ac.getBean("user");
//        User user = (User)ac.getBean("user2");
//        User user = (User)ac.getBean("u2");
//        User user = (User)ac.getBean("u3");
         User user = (User)ac.getBean("u4");
        user.show();

输出:csdn_闲言

6-3.import

  这个import。一般用于团队开发使用,它可以将多个配置文件,导入合并为一个。

  假设,现在项目中有多个人开发,这三个人负责不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml合并为一个总的!

  1. 张三
  2. 李四
  3. 王五

使用的时候,直接使用总的配置就可以了。


7、依赖注入

7-1.构造器注入

7-2.Set 注入

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

Address类

public class Address 
    private String address;
        省略setter

student类

public class Student 

    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbies;
    private Map<String,String> card;
    private Set<String> games;
    private String wife;
    private Properties info;
    省略setter

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="address" class="cn.bloghut.domain.Address">
        <property name="address" value="csdn_闲言"/>
    </bean>

    <bean id="student" class="cn.bloghut.domain.Student">
        <!--注入address 类型-->
        <property name="address" ref="address"/>
        <!--String 类型-->
        <property name="name" value="csdn_闲言"/>
        <!--String 类型-->
        <property name="books">
            <array>
                <value>JavaSE</value>
                <value>JavaWeb</value>
                <value>Spring</value>
                <value>SpringMVC</value>
                <value>Mybatis</value>
            </array>
        </property>
        <!--List-->
        <property name="hobbies">
            <list>
                <value></value>
                <value></value>
                <value>rap</value>
                <value>篮球</value>
            </list>
        </property>
        <!--Map-->
        <property name="card">
            <map>
                <entry key="闲言" value="csdn——闲言"></entry>
                <entry key="闲言博客" value="csdn——闲言——博客"></entry>
            </map>
        </property>
        <!--set-->
        <property name="games">
            <set>
                <value></value>
                <value></value>
                <value>rap</value>
                <value>篮球</value>
            </set>
        </property>
        <!--String-->
        <property name="wife" value="xxx"></property>
        <!--Properties-->
        <property name="info">
            <props>
                <prop key="p1">v1</prop>
                <prop key="p2">v2</prop>
                <prop key="p3">v3</prop>
            </props>
        </property>
    </bean>

</beans>

测试

public static void main(String[] args) 
    ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
    Student student = (Student)ac.getBean("student");
    System.out.println(student);

输出

Student
name='csdn_闲言', 
address=Addressaddress='csdn_闲言', 
books=[JavaSE, JavaWeb, Spring, SpringMVC, Mybatis], 
hobbies=[,, rap, 篮球], 
card=闲言=csdn——闲言, 闲言博客=csdn——闲言——博客, 
games=[,, rap, 篮球], 
wife='xxx', 
info=p3=v3, p2=v2, p1=v1


## 8、拓展方式注入 可以使用**p命名空间**和**c命名空间**进行注入
  1. p 命名空间对应 setter 方式注入(要提供set方法)
  2. c 命令空间对应 构造方法 (要提供有参构造方法)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-bea

以上是关于狂神说JavaSpring详解的主要内容,如果未能解决你的问题,请参考以下文章

狂神说JavaMybatis详解

狂神说JavaJavaWeb入门到实战--Servlet详解

狂神说JavaJavaWeb入门到实战--Tomcat详解

狂神说JavaMySQL最新教程通俗易懂--JDBC详解笔记

狂神说JavaJavaWeb入门到实战--Http协议详解

狂神说JavaJavaWeb入门到实战--Maven详解