spring框架

1.介绍spring框架

(1)Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

(2)Spring是一个轻量级开源的JAVAEE框架

  (3)  Spring提高了IOC和AOP:

  IOC:控制反转 ; 把创建java对象的权力交于spring容器来管理。

  AOP:面向切面编程  ; 在不改变源代码的前提下可以扩充功能。

  (4) spring的特点:

1.降低了组件之间的耦合性, 实现了软件各个层之间的解耦

2.可以使用spring容器提供的服务, 如: 事务管理, 消息服务

3.容器提供单例模式支持

4.容器提供AOP技术, 利用它很容易实现权限拦截, 运行期监控

5.容器提供了众多的辅助类, 能加快应用的开发(org.springframework.jdbc.core.JDBCTemplate 等)

6.Spring对主流的应用框架提供了集成支持, 例如: hibernate,JPA, Struts, Mybatis(IBatis)

7.Spring属于低侵入式设计, 代码污染度极低

8.独立于各种应用服务器

9.spring的DI机制降低了业务对象替换的复杂性

10.spring的高度开发性, 并不强制应用完全依赖于spring, 开发者可以自由选择spring的部分或者全部

2.Spring 框架的好处​

 (1)spring是最大的工厂

 (2)spring负责业务逻辑组件的框架和生成, 并管理业务逻辑组件的生命周期 

 (3)spring可以生产所有实例, 从控制器、 业务逻辑组件、 持久层组件

3.如何使用spring

(1)引入spring相关的依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.15.RELEASE</version>
        </dependency>
    </dependencies>

(2)创建Spring的配置文件

<?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:bean的唯一标识
          class: 类的全路径
    -->
     <bean id="userDao" class="com.dsf.UserDao"></bean>
</beans>

(3)创建一个Dao类

public class UserDao implements IUserDao {

    public void show(){
        System.out.println("你好啊");
    }
}

 (4) 创建interface 接口

public interface IUserDao {
    public void show();
}

(5)测试

public class Test1 {
    public static void main(String[] args) {

        //读取spring配置文件

        ApplicationContext app=new ClassPathXmlApplicationContext("application.xml");

        //获取bean对象多态
        IUserDao userDao = (IUserDao) app.getBean("userDao");
        userDao.show();
    }
}

 4. BeanFactory和ApplicationContext的区别

 4.1BeanFactory接口

(1) Spring容器顶层接口:获取Bean对象;管理类和类之间的关系(依赖关系)BeanFactory由    org.springframework.beans.factory.BeanFactory接口定义。

 (2)BeanFactory是工厂模式(Factory pattern)的实现,是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

 (3)BeanFactory接口包含以下基本方法:

(1)containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true。

(2)Object  getBean(String  str) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常。

(3)Object  getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型

(4)Class  getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常

(5)boolean  isSingleton(String) 判断给定名称的bean定义是否为单例模式      

(6)String[]  getAliases(String name) 返回给定bean名称的所有别名

 4.2ApplicationContext接口

是基于BeanFactory之上的,提供了应用程序框架服务,扩展的新功能如下:提供国际化的支持资源访问,如URL和文件 事件传递载入多个配置文件等 实现类常见有三个:

(1)ClassPathXmlApplicationContext:-classpath路径加载xml文件的

(2)FileSystemXmlApplicationContext:基于项目根路径进行加载xml文件的

(3)AnnotationConfigApplicationContext:基于注解的配置,基于类书写的配置

4.3两者之间的区别是:

(1)他们属于不同的包

     BeanFactory来自spring.beans.jar下

   ApplicationContext来自spring.context.jar下

 (2)BeanFactory需要手动注册,而ApplicationContext则是自动注册

 (3)ApplicationContext:(饿汉模式)只要一读取配置文件,马上就会创建配置文件中配置的对象
 (4)BeanFactory:(懒汉模式)什么时候getBean("id"),也就是说当根据id获取对象时,才会创建

5. 获取bean的方式

(1) 通过bean.xml文件中bean标签的id的值获取bean(使用默认构造方法)

IUserDao iUserDao= (IUserDao) app.getBean("userDao");
//根据bean的id获取Bean对象,强制转换

(2) 通过类型去获取

IUserDao userDao = app.getBean(IUserDao.class);  
//通过类型获取bean对象

确保bean的类型是唯一的 不然会报错:org.springframework.beans.factory.NoUniqueBeanDefinitionException

(3) 通过 id + 类型去获取

IUserDao userDao = app.getBean("userDao2", IUserDao.class);

6. bean的作用范围

bean对象的作用范围调整需要配置scope属性,设置单例还是多例(只针对ApplicationContext接口来说,默认是单例的

单例:---无论创建多少次对象 他们始终指向同一个实例。

scope:常用 singleton,prototype

singleton:单例的(默认值)当加载配置文件时,就会创建对象。

prototype:多例的(当getBean时才会创建对象)

request:作用于请求范围---同一个那么使用bean同一个。

session:作用于会话范围---同一个会话

7什么是程序的耦合

耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。耦合性存在于各个领域,而非软件设计中独有的,但是我们只讨论软件工程中的耦合。 在软件工程中,耦合指的就是就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。

它有如下分类

(1)内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。

(2)公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。

(3) 外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。

(4) 控制耦合 。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。

(5)标记耦合 。若一个模块 A 通过接口向两个模块 B 和 C 传递一个公共参数,那么称模块 B 和    C 之间存在一个标记耦合。

(6) 数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。

(7) 非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。

8.IOC控制反转

IOC:控制反转 创建对象!

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

9.DI依赖注入

DI 依赖注入:目的就是给对象中的属性赋值。
DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。**依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。**通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

9.1依赖注入的类型有哪些

基本数据类型, 字符串类型,引用类型,集合类型

9.2如何实现注入对象的属性值

(1)创建一个类:提供set方法

public class Student {
     private Integer age;
     private String name;

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("=============setName=======================");
        this.name = name;
    }
}

(2)配置文件:---在bean标签中<property name="属性名" >

<?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容器会帮你创建该bean的对象-->
    <bean id="student01" class="com.dsf.entity.Student">
        <!--property:表示为类中属性注入值,调用的为set方法
                name:表示属性名
                value:注入基本类和字符串类型时使用value
        -->
        <property name="name" value="易烊千玺"/>
        <property name="age" value="22"/>
    </bean>
</beans>

10. 使用spring注入其他数据类型

10.1注入类对象类型

 

 10.2 注入集合类型

注入list集合:

  10.3 注入set和map集合

 11.自动注入

public class UserController {

    private UserDao userDao;

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

    public void fun(){
        userDao.show();
    }
}
public interface UserDao {

    public void show();
}

public class UserDao01 implements UserDao {
    public void show() {
        System.out.println("userDao01----------show方法");
    }
}

public class UserDao02 implements UserDao{
    public void show() {
        System.out.println("userDao02*****************show方法");
    }
}

 12.使用注解完成IOC和DI功能

(1)包扫描配置文件

 <!--包扫描-->
    <context:component-scan base-package="com.dsf.demo3"/>

(2)创建controller

@Controller  //表示控制层注解,如何没有设置bean的id 默认为类的名称首字母小写   
public class UserController {

    //@Autowired //按照类型自动注入 如果需要自己指定名村注入需要使用另一个注解配合使用
    @Autowired
    @Qualifier(value = "userDaoImpl01") //<property name="userDao" ref="userDaoImpl01">
    private UserDao userDao;

    public void fun(){
        userDao.print();
    }
}

(3) dao接口和实现类

@Repository
public class UserDaoImpl01 implements UserDao {


    public void print() {
        System.out.println("userDao01~~~~~~~~~~~~~~~~~~~~~~~print方法");
    }
}



@Repository
public class UserDaoImpl02 implements UserDao {


    public void print() {
        System.out.println("userDao02~~~~~~~~~~~~~~~~~~~~~~~print方法");
    }
}

@Controller+@Respository+@Service+@Component
没有区别: 他们的底层都是用的@Component
实际意思就在于区分层的。
@Controller控制层
@Respository持久化层
@Service 业务层
@Component 最底层的bean注解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值