图灵学院Java架构师-VIP-Spring整体架构分析

图灵学院Java架构师-VIP-Spring整体架构分析
一、Spring框架的整体架构
图灵学院Java架构师-VIP-Spring整体架构分析_第1张图片
spring是由数据访问(Data Access),web层,AOP,Aspects,Instruction,Message,Core Container(beans、core、context、sqEl),下面依次对各个模块进行介绍:
Data Access/Integration(数据访问,和数据库相关的部分)
jdbc:其实就是对jdbc的封装,消除了原生jdbc冗长的代码。
原生的jdbc:
1、加载驱动
2、建立连接
3、创建preparedstatement
4、执行sql
5、获取结果集
6、关闭连接

String url = "jdbc:mysql://localhost:3306/Test?characterEncoding=utf8";
String username = "root";
String password = "root";
Connection connection = null;
PreparedStatement ps = null;
//PreparedStatement与Statement的区别,PreparedStatement是一种预编译的方式
//,更安全,防止SQL注入问题
ResultSet rs = null;
try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    connection = DriverManager.getConnection(url,username,password);
    ps = connection.prepareStatement("select id from user");
    rs = ps.executeQuery();
    while(rs.next()){ //ResultSet下标是从1开始的
        System.out.println(rs.getString(1));
    }
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (SQLException e) {
    e.printStackTrace();
}finally {
    rs.close();
    ps.close();
    connection.close();
}

 springjdbc:1、建立一个DataSource
                     2、给jdbcTemplate注入之后,就可以使用jdbcTemplate操作sql了
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/Test?characterEncoding=utf8");
dataSource.setUsername("root");
dataSource.setPassword("root");

JdbcTemplate template = new JdbcTemplate(dataSource);

template.update("update  user set username=? where id=?");


       JNDI的方式

ORM(object relational Mapping) 对象关系映射
给orm框架Hibernate jpa等提供了一个交互层
OXM 提供了一个对object xml映射实现的抽象
XStream bean与xml的转换

XStream xs = new XStream();
Person person = new Person();
person.setName("zhangsan");
person.setAddress("zz");
person.setAge("23");
xs.alias("person",Person.class);
String xml = xs.toXML(person);
System.out.println("xml:"+xml);
Object obj = xs.fromXML(xml);
System.out.println(obj.toString());

执行结果:
xml:
  zhangsan
  23
  
zz
Person{name='zhangsan', age='23', address='zz'}

jms:java message service
主要是消息发布和接受消息的服务
Transaction
事务 是spring经常使用到的,支持编程式和声明式事务,编程式就是直接在代码写,声明式事务应该就是一种约定,可以使用xml或注解使用

//在ioc的基础上 定义编程式事务先定义一个类TransactionDefine
// 继承DefaultTransactionDefinition
ClassPathXmlApplicationContext cx = new ClassPathXmlApplicationContext();

//在spring配置文件已配置
JdbcTemplate jdbcTemplate = cx.getBean(JdbcTemplate.class);
PlatformTransactionManager transactionManager = cx.getBean("transactionManager");

DefaultTransactionDefinition df = new TransactionDefine();
TransactionStatus status = transactionManager.getTransaction(df);

try{
    jdbcTemplate.update("update user set username = 'zz' where id = '2'");
    transactionManager.commit(status);
}catch (Exception e){
    e.printStackTrace();
    transactionManager.rollback(status);
}

//声明式事务
注解:


@Transactional
public void method01(){
    //做处理
}
xml:

   
   
      
         PROPAGATION REQUIRED
         PROPAGATION REQUIRED
      
   


   
      
         *Service
      
   
    

spring web
提供了基础的web继承特性,如多文件上传、servletListener等 serlet 需重新学习
Spring AOP
切面编程
Aspects
模块提供了对 AspectJ 的集成支持。
Instrumentation
模块提供了 class instrumentation 支持和 classloader 实现,使得可以在特定的应用服务器上使用。
Test
主要是对junit单元测试的支持
Sring EL**
提供了一些表达式语言
Core Container(核心容器)
模块作用:Core 和 Beans 模块是框架的基础部分,提供 IoC(控制反转)和依赖注入特性。spring beans的核心就是 BeanFactory,是一个强大的工厂,对bean进行管理,它提供对 Factory 模式的经典实现来消除对程序单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置
1:core: Spring 框架基本的核心工具类, Spring 的其他组件都要用到这个包 里的类, Core模块是其他组件的基本核心
2:beans(beanFactory):它包含访问配置文件、创建和管理 bean 以及进行依赖注入,操作相关的所有类
3:context:构建于 Core 和 Beans 模块基础之上,提供了一种类似JNDI 注册器的框 架式的对象访问方法。 Context 模块继承了 Beans 的特性,为 Spring 核 心提供了大量 扩展,添加了对国际化(例如资源绑定)、事件传播、资源加载和对 Context 的透明创 建的支持。 Context 模块同时也支持 J2EE 的一些特 性, ApplicationContext 接口是 Context 模块的关键,applicationContext是对beanFactory的扩展。
beanFactory和applicationContext的本质区别
beanFactory是懒加载的,在容器启动时,是不会加载bean的,在获取时才会加载是实例化bean,好处就是启动时很快,按需加载,但是applicationContext是非懒加载的,容器启动时,就会加载bean到容器中,是使用时,直接拿就好了,启动慢,但是获取速度快,但是也可以实现懒加载,给bean加上@lazy就可以了。
BeanFactory 只能管理单例(Singleton)Bean 的生命周期。它不能管理原型(prototype,非单例)Bean 的生命周期。这是因为原型 Bean 实例被创建之后便被传给了客户端,容器失去了对它们的引用。

你可能感兴趣的:(spring)