Spring-----春天

什么是spring?
简单介绍一下就是一个开源的,轻量级的,面向切面的,简化企业开发的复杂性的框架。
spring有哪些优点呢?
1.方便解耦,简化开发
        通过spring提供的IOC容器,可以将对象间的依赖关系交由spring进行控制,避免硬编码所照成的过度程序耦合,从此我们就可以专注于写代码而不需要考虑其他的事情
2.spring的特性aop可以方便我们面向切面编程,从而实现程序的扩展
3.声明式事务的支持,可以让我们不在依赖于以往的编程式事务,通过声明式的方式可以更灵活的进行事务的管理,提高开发效率和质量
4.方便集成各种优秀的框架
5.降低对javaEE api的使用难度
6.Spring源码使用了大量的设计模式,设计巧妙,结构清晰,匠心独运,它的源码可以称的上是一个模板,非常值得我们进行学习。
复制代码

Spring的体系结构

spring的核心之一:IOC

IOC翻译过来就是控制反转的意思,那么什么是控制反转呢,大致的意思就是说原来程序是由程序控制的,后来控制权变了,这就是控制反转。
首先我们来看一段代码
复制代码

从上面的代码来看,我们有没有看出一些问题,相信有一定技术水平的已经看出来了吧。

    UserService userservice=new UserServiceImpl();
    关键就在这行代码,如果我们在dao层加一个实现类,想要调用mysql数据库怎么办
    是不是就要把newUserServiceImpl()给改一下,这种硬编码造成的代码耦合性太强,我们就无法灵活的切换数据库,控制权始终在程序的手里。
复制代码

如何进行改进呢

看出来了吗,在service加一个set方法,在测试类中用户就可以通过这个set方法来选择它想要调用哪个数据库,我们就不用再去改代码了,耦合性降低,最终控制权由程序转向了用户。我们通过这个小例子简单理解一下控制反转。

Ioc快速入门

1.创建Maven项目,导入依赖坐标,Spring的依赖坐标
2.编写Dao接口UserDao以及实现UserDao接口
3.创建Spring核心配置文件,并配置UserDaoImpl
4.测试:使用Spring的APi,获取Bean的实例对象
复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
复制代码
    public interface UserDao {
    void add();
    }

复制代码
public class UserDaoImpl implements UserDao {
    
   
    public  void add() {
        System.out.println("调用了UserDaoImpl的add方法~!~");
    }
}
复制代码

创建核心Spring配置文件,配置文件名称通常交applicationContext.xml

<!--
    在这里告诉spring要创建哪个类的对象,并且给这个对象起一个别名

    bean标签:
            作用:用来托管(类)对象
            属性:
                id:是唯一标识,不能出现重复
                class:托管类的全路径
 -->
<bean id="ud"  class="com.itheima.dao.impl.UserDaoImpl" />
复制代码

接下来我们进行测试

spring核心配置文件详解

    scope:范围的意思,它的值主要用到的有2个
            value:singleton单例的,我们无论找工厂要多少次对象,永远是它
                  prototype多例的,我们找工厂要对象,每次的对象都不一样
    init-method:初始化方法,一般在对象创建的时候执行
    destory-method:销毁方法,在对象销毁的时候执行
    
    sping创建对象时默认调用的是无参构造
<bean id="ud" class="com.itheima.dao.impl.UserDaoImpl"  
      scope="singleton" init-method="" destroy-method="">
</bean>
复制代码

依赖注入

刚才说了Spring可以为我们创建对象,那么属性该如何帮我们赋值呢
    没错----就是通过依赖注入
复制代码

第一种方式set方式注入

在bean标签中使用property标签 通过name value ref 来对属性赋值

<bean id="" class="">
	<property name="属性名" value="属性值"></property>
    <property name="属性名" ref="bean的id"></property>
</bean>
复制代码

第二种方式构造方法注入

 <bean id="" class="">
	<constructor-arg name="构造参数名称" value="构造参数的值"></constructor-arg>
    <constructor-arg name="构造参数名称" ref="bean的id"></constructor-arg>
</bean>
复制代码

第三种方式P名称空间注入(本质上就是set注入)

 <bean id="" class="" p:属性名="简单值" p:属性名-ref="bean的id"></bean>
复制代码

引入外部配置文件

 <!--导入进来db.properties-->
    <context:property-placeholder location="db.properties"/>

    <!--在下面使用 ${}来取值-->
    <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${driverClass}"/>
        <property name="jdbcUrl" value="${jdbcUrl}"/>
        <property name="user" value="${user}"/>
        <property name="password" value="${password}"/>
    </bean>
复制代码

分模块引入配置文件

    <import resource="classpath:applicationContext-service.xml"/>
    <import resource="classpath:applicationContext-dao.xml"/>
复制代码

Spring整合Juint

@Runwith:用在测试类上,用于声明不在使用junit,而是使用spring运行环境
@ContextConfiguration:用在测试类上,用于指定spring配置类或配置文件,可以加载spring工厂

要使用以上注解要导入一下依赖
复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
复制代码
       @RunWith
        1. 表示使用的单元测试的环境,不再是以前的Junit的测试环境,而是spring针对Junit提供的测试环境
        2. 这套spring提供的测试环境在背后会帮助我们创建工厂。
    @ContextConfiguration
        1. 告诉spring的测试环境,配置文件在哪里?
        2. classpath: 这是固定写法,表示要在类路径底下找配置文件。
 */

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestUserServiceImpl02 {

    //让spring把想要用到的对象给注入进来!
    // 这个注解是自动注入的意思,让spring把对象注入进来。
    @Autowired
    private UserService us;

    @Test
    public void testAdd(){

        /*ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserService us = (UserService) context.getBean("us");
        */
        us.add();

    }
}



链接:https://juejin.cn/post/7031821770093133861