Spring

spring

  • spring是分层的JavaSE/EE full-stack 轻量级开源框架 ,是以IOC(inverse of control 控制反转和AOP(aspect oriented Programming 面向切面编程)为内核,使用基本的javabean来完成以前可能只由EJB完成的工作
  • 通常使用三层:表示层(controller) ,业务逻辑层(service)持久层(dao),spring对每一层都进行的技术支持。
  • 表示层(controller):提供了Struts等框架的整合
  • 业务逻辑层(service):可以管理事务,记录日志。
  • 持久层:可以整合Hibernate,JdbcTemplate等技术

spring的优点

  • 不仅可以用于服务器端开发,也可以应用于任何Java应用的开发,
  • 方便继承各种优秀框架
  • 支持声明式事务处理
  • 支持AOP
  • 方便程序测试
  • 方便解耦,简化开发,降低JavaEE Api的使用难度

spring的体系结构

  • spring是一个分层的结构,它的一系列功能要素被分成20个模块,分成4部分。
    在这里插入图片描述

  • Beans:提供了BeanFactory,Spring将管理对象称为Bean

  • Core :提供了Spring框架的基本组成部分,包括Ioc和DI功能

  • Context:建立在Core和Beans模块的基础之上,它是访问定义和配置的任何对象的媒介。

  • SPEL:是运行时查询和操作对象图的强大的表达式语言。

  • JDBC:提供了一个JDBC的抽象层,减少开发过程中对数据库操作的编码

  • ORM:对流行对象关系映射的API,

  • OXM:提供了一个支持对象/XML映射的抽象层实现

  • JMS:java消息传递服务

  • Transactions:支持对实现特殊接口和所有pojo类的编程和声明式的事务管理

  • Servket:也称为Spring-webmvc模块,包含Spring模型-视图-控制器(MVC)和REST Web Services实现的Web程序

  • web:提供基本的web开发集成的特性

  • AOP:面向切面编程实现

  • Aspects:是一个成熟的面向切面编程的框架

    spring的基础包

    在这里插入图片描述

spring的核心容器

BeanFactory

  • BeanFactory是一个管理Bean的工程,它主要是负责初始各种Bean,并调用他们的声明周期的方法。
  • 实际开发中应用的并不多
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("F:/applicatioinContext.xml"));

ApplicationContext

  • 它式BeanFactory的子接口,被称为应用上下文,包含Spring BeanFactory的所有的功能,还添加了其他的功能。

ClassPathXmlApplicationContext

  • 通过classPathXmlApplicaitonContext创建,从classpath类路径中寻找XML的配置文件,找到后加载完成ApplicationContext的实例化工作,
 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
  • 其中的String configLocaiton 参数指定的是Spring配置文件的名称和位置。

FileSystemXmlApplicaitonContext

  • FileSystemXmlApplicationContext会从文件系统(绝对路径)找到xml文件,并装在完成ApplicationContext的实例化工作。
 ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext(String configLocation);

Java项目和web项目中不同的装配方式ApplicationContext

  • 在java项目中,通常会使用ClassPathXmlApplicationContext容器来实例化ApplicationContext容器,
  • 在Web项目中,ApplicaitonContext的实例化会交给Web服务器来完成,通常会使用ContextLoaderListener实现的方式。在web.xml中配置即可。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!--Spring将加载spring目录下的applicaitonContext.xml文件-->
        <param-value>
            classpath:spring/applicaitonContext.xml
        </param-value>
    </context-param>
    <!--指定以ContextLoaderListener方式启动Spring容器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

获取Bean的方法

  • T getBean(Class requiredType): 根据类的实例来获取Bean的实例。
  • Object getBean(String name):根据容器bean中的id或name来获取指定的Bean,获取后要进行强制类型的转换。

Spring的入门程序

applicaitonContext.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-4.3.xsd">
   
    

</beans>

程序

UserDao

package com.yzb.chapter01;

public interface UserDao {
    public void say();
}

UserDaoImpl

package com.yzb.chapter01;

public class UserDaoImpl implements UserDao {
    @Override
    public void say() {
        System.out.println("userdao say hello world");
    }
}

Test

package com.yzb.chapter01;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;

public class Test {
    public static void main(String[] args) {
        //初始化spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过容器获取UserDao的实例
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.say();
    }
}

application.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-4.3.xsd">
    <!--将指定类配置给Spring,让Spring创建对象的实例-->
    <bean id="userDao" class="com.yzb.chapter01.UserDaoImpl"></bean>


</beans>

控制反转的一些讲解

  • 在上面的例子中,并没有通过new关键字来创建UserDao接口的实现类对象,而是通过spring容器来获取,这就是控制反转的工作机制。

依赖注入

理解

  • 在使用了Spring容器后,对象的实例不再是通过new关键字来创建(被调用者创建),而是通过spring容器统一创建,spring容器负责控制程序之间的关系,不在是调用者的程序代码去控制,控制权通过应用代码转移到了Spring容器中,控制权发生了反转,这就是控制反转。
  • 依赖注入:Spring容器将被依赖的对象赋值给调用着的成员变量,这就相当于为调用者注入了它依赖的实例,这就是spring的依赖注入。

依赖注入的两种方法

属性Setter方法注入

  • 指Spring容器使用setter方法注入被依赖的实例
  • 通过调用无参构造方法或者无参静态工厂方法实例化bean后,调用bean的setter方法,即可实现setter方法的依赖注入
UserService
package com.yzb.chapter01;

public interface UserService {
    public void say();
}

UserServiceImpl
package com.yzb.chapter01;

public class UserServiceImpl implements UserService {
    //声明UserDao的属性
    private  UserDao userDao;
    //添加UserDao属性setter的方法,用于实现依赖注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void say() {
        this.userDao.say();
        System.out.println("UserService say hello world");
    }
}

applicationContext.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-4.3.xsd">
    <!--将指定类配置给Spring,让Spring创建对象的实例-->
    <bean id="userDao" class="com.yzb.chapter01.UserDaoImpl"></bean>
    <!--添加一个id为userService的实例-->
    <bean id="userService" class="com.yzb.chapter01.UserServiceImpl">
        <!--将id为userDao的实例注入到userService实例中-->
        <!--property用于调用Bean实例中setUserDao的方法完成属性的赋值,并实现依赖注入,其中name是Bean实例相应的属性名,而ref属性用于指定属性值-->
        <property name="userDao" ref="userDao"/>
    </bean>


</beans>
Test
package com.yzb.chapter01;

        import org.springframework.beans.factory.BeanFactory;
        import org.springframework.beans.factory.xml.XmlBeanFactory;
        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;
        import org.springframework.context.support.FileSystemXmlApplicationContext;
        import org.springframework.core.io.FileSystemResource;

public class Test {
    public static void main(String[] args) {
        //初始化spring容器,加载配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过容器获取UserDao的实例
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.say();
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.say();
    }
}

构造方法注入

  • 指Spring容器使用构造方法来注入被依赖的实例,基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表一个依赖。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值