Spring学习一(Spring介绍)

本文介绍了Spring框架的基本概念,包括IOC控制反转、DI依赖注入及AOP切面编程等核心思想。并通过实例展示了如何使用Spring进行Bean的配置和依赖注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Spring介绍

通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

2、Spring思想的核心

这里写图片描述

1、IOC控制反转

IOC(Inversion Of Control)可以减少代码的耦合问题。控制反转一般分为两种类型,依赖注入(Dependency injection)和依赖查找(Dependency loopup)。

1、IOC可以算是一种设计模式。
2、IOC可以看做是工厂模式的升华,可以把IOC看作一个大的工厂。在这个工厂中要生成的对象都是在XML文件中配置的。然后利用反射,获取XML类名中的对象,生成。从而把我们在java中一般需要new出来的对象,交给Spring来处理。提高代码的灵活性。
3、IOC的本质实现是用java的反射,在运行时期获取字段,生成对象,也可以得到对象的属性和方法。
反射在框架中应用广泛,像Hibernate,Spring很多地方都是通过运用反射来实现的。

IOC的优缺点

优点:

代码解耦,把生成对象放在xml中。


缺点:

  1. 生成一个对象的步骤变复杂了(事实上操作上还是挺简单的)
  2. 使用反射,性能损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。
  3. 缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。

2、DI依赖注入

DI(Denpendency injection)IOC思想的核心。其实也就是IOC思想内部的具体实现。

当我们在一个java类中,需要使用另一个java类中,我们需要new也实例。但在Spring中,创建被调用的类不在由调用类来完成,因此成为反转。创建者被调用的实例化,由Spring来完成,然后注入到调用者中,也就是注入。

示例

依赖:A类使用B类,我们就成A类依赖与B类。
依赖注入:A类使用B类,将自动创建B类实例,自动设置给A类
例如:UserService 需要使用 UserDao,当从spring容器获得UserService时,spring将自动的创建UserDao,并设置给UserService。此时UserService不需要任何操作就可以使用UserDao。

3、AOP切面编程

AOP(Aspect Oriented Programming)面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护。
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

1、这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
2、将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

AOP其实是将琐碎的事务和逻辑代码相分离,以便我们更好的关注逻辑代码
代码逻辑比如是插入一条数据,那么琐碎事务就包括获取连接和关闭连接,事务开始,事务提交。
切面就是指在大堆繁琐事务中的逻辑代码。

2、Spring的好处

这里写图片描述

3、Spring框架

这里写图片描述
Spring的核心组件:
beans,core,context,el

4、入门Demo

1.导jar包
2.测试java类,User类
3.beans.xml文件配置
4.单元测试
示例代码如下
1、User类

package com.exmaple.spring;

public class User {

   public void hello(){
       System.out.println("hello  my spring");
   }
}

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 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 将对象配置给spring,id唯一名称,class为实现类全限定类名 -->
    <bean id="userId" class="com.exmaple.spring.User"></bean>
</beans>

3、测试代码

package com.exmaple.spring;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring {
    // 不通过Spring代码
    @Test
    public void testHello() {
        User user = new User();
        user.hello();
    }

    // 通过使用Spring代码如下
    @Test
    public void testHelloSpring() {
        // /SpringDemo/src/com/exmaple/spring/beans.xml
        String xmlPath = "com/exmaple/spring/beans.xml";
        //获取Srping容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                xmlPath);
        //通过容器获取配置文件中id,获取实例
        User user = (User) applicationContext.getBean("userId");
        //调用实例中的方法
        user.hello();
    }
}

示例2

这里写图片描述
1、BookDao和BookDaoImpl代码

package com.exmaple.spring2;

public interface BookDao {
    void save();
}
package com.exmaple.spring2;

public class BookDaoImpl implements BookDao{

    public void save() {
        // TODO Auto-generated method stub
        System.out.println("save book");
    }

}

2、BookService和BookServiceImpl代码

package com.exmaple.spring2;

public interface BookService {
    public void addBook();
}
package com.exmaple.spring2;

public class BookServiceImpl implements BookService {

    private BookDao bookDao;
    //依赖注入,service使用dao将由工厂自动创建并设置。提供接口对应setter方法
    public void setBookDao(BookDao bookDao){
        this.bookDao=bookDao;
    }

    public void addBook() {
        // TODO Auto-generated method stub
         this.bookDao.save();
    }

}

3、beans.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 
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 将对象配置给spring,id唯一名称,class为实现类全限定类名 -->
    <bean id="bookServiceId" class="com.exmaple.spring2.BookServiceImpl">
        <!-- 给指定bean的属性,确定设置的内容 * name : 表示 bean的属性名称(通过setter获得) * ref : 引用,表示 
            引用spring容器已经配置好的其他bean -->

        <property name="bookDao" ref="bookDaoId"></property>


    </bean>
    <bean id="bookDaoId" class="com.exmaple.spring2.BookDaoImpl"></bean>
</beans>

最后测试代码

public class TestSpring {
    // 不通过Spring代码

    // 通过使用Spring代码如下
    @Test
    public void testHelloSpring() {
        // /SpringDemo/src/com/exmaple/spring/beans.xml
        String xmlPath = "com/exmaple/spring2/beans.xml";
        // 获取Srping容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                xmlPath);
        // 通过容器获取配置文件中id,获取实例
        BookService bookService = (BookService) applicationContext
                .getBean("bookServiceId");
        // 调用实例中的方法
        bookService.addBook();
    }
}

Spring学习二(Bean的配置)
http://blog.youkuaiyun.com/androidxiaogang/article/details/52662322
参考
http://blog.youkuaiyun.com/taijianyu/article/details/2338311/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值