Java开发技术之 SSM框架的学习分享

Spring框架:

Spring是一个轻量级JavaEE开发框架,以Ioc和AOP为核心,在spring中,认为一切都是资源,而资源是类的实例化对象(Bean),容纳并管理这些Bean的是spring提供的Ioc容器,所以spring是基于Bean的编程

优点:

非侵入式:指的是框架的API不会在业务逻辑上出现,即业务逻辑是纯净的

容器:spring提供了容器功能,用于管理对象生命周期和对象之间的依赖关系,通过配置文件可以配置对象和依赖关系,到时候可以直接使用

Ioc:控制反转,依赖关系的转移,如果之前依赖于实现,那么现在依赖于抽象,核心思想就是面向接口编程

依赖注入:对象之间依赖关系的实现,包括接口注入,构造注入,属性setter注入,spring中支持后两者

AOP:面向切面编程,网上各种解说都有,笔者觉得大致就是,在不改动原有代码的情况下,对目标进行功能增强和扩充,即在某点插入某面,点即原有功能代码,面即待扩充功能代码

spring主要包含了3大部分:Core container,Data Access/Integeration,Web

Core container:Beans,Core,Context,Spring EL

Data Access/Integeration:JDBC等

WEB:web,servlet,websocket

其他:AOP,Test等

Ioc/DI:

Spring的核心机制Ioc容器,用来削减组件之间的耦合度,在java中,调用者和被调用者存在依赖关系,通过new关键字实例化对象会导致两者耦合增加,不利于项目维护,在Spring框架中,创建和管理对象的工作不再由调用者执行,而是交给框架实施,这样,控制权限由代码程序转移给了spring框架,控制权发生了反转

spring提倡面向接口编程,DI的核心就是:明确定义组件接口,独立开发各个组件,然后根据组件的依赖关系进行组装运行

注入类型:

构造方法注入:

条件:需要带参构造方法

//配置文件

<bean >

<constructor-arg name="name" value="小白"/>

<constructor-arg name="age" value="2"/>

</bean>

//功能代码

private static Cat cat;

public static void main(String[] args) {

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

cat=context.getBean("cat",Cat.class);

System.out.println(cat.toString());

}

//输出

Cat{name='小白', age=2}

setter方法注入:

条件:需要目标有set方法和无参构造

<bean >

<property name="name" value="小红"/>

<property name="age" value="3"/>

</bean>

操作结果同上

p命名空间:

需要在文件头增加条目:

xmlns:p="http://www.springframework.org/schema/p"

//配置Bean

<bean p:name="小黑" p:age="4"/>

操作结果同上

Bean装配:

spring支持xml和properties两种方式的配置文件,常用xml进行bean的创建和依赖管理,properties存放静态属性;

xml配置文件的根标签就是beans,其内包含若干bean标签,用来定义一个bean并描述依赖关系和如何装配

bean包含以下属性(在bean标签内):

id:bean的唯一标识,装配时根据id获取对象

name:容器同样可以通过name实现对象配置和管理,可以指定多个,用逗号分隔

calss:具体实现类,全路径

scope:作用域,5种

bean子元素标签:

<constructor-arg>:构造注入实例化bean,下游index(属性序号),type(参数类型),ref/value(指定参数值)

<property>:调用bean中setter方法进行注入,完成属性赋值,name指定属性名,value/ref指定值

ref:注入引用其他bean

value:指定一个常量值

list,map,set,entry:指定bean的属性类型为对应类型的属性值

Bean作用域:

singleton:单例,仅定义一个bean对象

property:定义多个对象实例

request:一次Http请求,容器返回一个实例,仅作用于基于web的spring application context情形下有效

session:一次会话返回同一个bean实例,效力同上

global session:在一个全局Http session会话中,返回同一个实例,仅适用protlet context有效

装配方式:

基于xml装配:

参照注入部分,这里笔者有些混乱,感觉基于xml的注入和装配时一个操作两个概念

基于注解装配

@Service

class Test1 {

}

@Component

class Test2 {

}

@Controller

class Test3 {

}

@Qualifier()

@Controller

public class testOut {

@Value("#{spring.name}")

private String name;

@Value("#{Cat.id}")

private String id;

@Resource

private Test1 test1;

@Autowired

private Cat cat1;

private static Cat cat;

@RequestMapping(value = "/index.html",method = RequestMethod.POST)

public static void main(String[] args) {

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

cat = context.getBean("cat", Cat.class);

System.out.println(cat.toString());

}

}

spring中使用了一系列注解进行bean的装配,下面介绍一些常见的注解:

@Component

泛化概念,作用域任何层次,仅仅标识一个组件(bean),写在类上即可

@Repository

用于将数据访问层(DAO)的类标识为spring中的bean,作用同上

@Service

通常作用于业务层,功能同上,将业务层类表示为bean

@Controller

通常作用于控制层(如spring mvc的controller),将控制层类标识为bean,作用同上

@Autowired

用于对bean的属性变量,属性的setter方法及构造方法进行标注配合相应的注解处理器完成bean的自动装配,默认按照bean类型装配,加上@Qualifier注解,可以直接指定一个bean实例名称进行装配

@Resource

作用相当于@Autowired,区别在于这里按照bean实例名称装配,包含name和type可以都不指定,这两个影响装配进行

@Qualifier(这一对注解暂时不太会使用,仅做了解)

与@Autowired配合,默认按照类型装配,bean实例名称有该注解参数指定

@RequestMapping

为控制器指定可以处理哪些请求可以用在类或方法上,并且在方法上时可以定义支持哪些请求方式

以上作用类似xml装配,效果差不多

@Value

当某些定义值在配置文件加载后可以通过该标签获取,有两种方式

@Value("${配置文件中的属性字段}")

@Value("#{obj.property}")

@Value("#{spring.name}")//properties配置文件中额属性字段

@Value("#{Cat.name}")//bean Cat的name属性

<bean name="cat1,cat2" scope="prototype" autowire="byName">

自动装配:

在上述代码中,通过autowire="byName"定义了该bean的装配方式为按照名称自动装配

Spring MVC

该框架中,Controller替代了Servlet担负控制器的功能,Controller接收请求,调用相应的组件进行请求处理,处理完成后返回结果,Controller调用相应的View并对结果进行视图渲染,最终相应传送到客户端

该框架暂不做较多介绍,笔者目前仅处于会用阶段,等后续掌握后再做探讨

Mybatis

支持普通SQL查询,存储过程和高级映射的持久层框架,封装了几乎所有的JDBC代码和参数的手工设置以及结果集查询检索等,使用简单的xml或注解做配置和定义映射关系

需要配置:数据库属性(账户名,密码,url等),接口映射文件等

数据库静态属性文件:

database.properties:前4行为必须的,该文件通过第一个配置文件application进行加载

<context:property-placeholder location="classpath*:config/dev/database.properties"

ignore-unresolvable="false" ignore-resource-not-found="true"/>

dataSource.driverClassName=com.mysql.cj.jdbc.Driver

dataSource.url=jdbc:mysql://localhost:3306/sharetec?serverTimezone=Asia/Shanghai

dataSource.username=root

dataSource.password=admin001

dataSource.initialSize=10

dataSource.minIdle=10

dataSource.maxActive=200

database.xml:配置了数据库连接属性

<bean init-method="init"

destroy-method="close">

<property name="driverClassName" value="${dataSource.driverClassName}"/>

<property name="url" value="${dataSource.url}"/>

<property name="username" value="${dataSource.username}"/>

<property name="password" value="${dataSource.password}"/>

</bean>

<bean >

<property name="dataSource" ref="dataSource"/>

<property name="configLocation" value="classpath:mybatis/config/mybatisConfig.xml"/>

</bean>

spring-mapper.xml配置了mapper接口bean对象,并引入数据库配置文件

<!--映射mspper接口-->

<bean >

<property name="mapperInterface" value="com.shareTec.mapper.UserInfoMapper"/>

<property name="sqlSessionFactory" ref="sqlSessionFactory"/>

</bean>

<!--映射mybatis的sql配置文件-->

<import resource="spring-database.xml"/>

mybatisConfig.xml配置用到的bean对象别名和设置sql的配置文件路径

<configuration>

<!--配置bean别名和mapper-->

<typeAliases>

<typeAlias alias="userInfo" type="com.shareTec.bean.UserInfo"/>

<package name="com.shareTec.bean"/>

</typeAliases>

<mappers>

<mapper resource="mybatis/UserInfoMapper.xml"/>

</mappers>

</configuration>

ObjectMapper.xml 在该文件书写sql代码

<insert parameterType="userInfo">

insert into userinfos

(userId,username,password,cardId,state)

values

(#{userId},#{username},#{password},#{cardId},#{state})

</insert>

通过以上配置文件可以实现java代码和数据库的互操作

SQL进阶

sql普通的增删改查语句

insert into userinfo (列) values (值);

delete from 表名 where 字段条件

drop table 表名truncate table 表名

update 表名 set (字段=值) where (条件)

select (字段) from 表名 where 条件

在实际中可能场景比较复杂,这是后使用动态SQL技术会比较适合(前提是熟练使用,笔者目前不算特别熟练,只能大概使用)

insert一般不使用(或许笔者接触面比较窄,能想到几种场景,但是感觉没必要,可以直接在数据库设置字段属性也能达到相应目的)

项目中一般不对数据库进行删除操作,通常使用状态字段标识数据有效性(比如00,01等)

改,又叫更新:

<update parameterType="userinfo">

update userinfos

<set>

<if test="username!=null">

username=#{username},

</if>

</set>

<choose>

<when test="userId!=null">

userId=#{userId}

</when>

<otherwise>

cardId=#{cardId}

</otherwise>

</choose>

</update>

上述代码实现了字段判断和条件选择更新,用到了<choose>,<if>,<when>,<otherwise>标签

<select resultType="userinfo">

select * from userinfos where userId in

<foreach collection="list" item="users" open="(" close=")" separator=",">

#{users}

</foreach>

</select>

上述代码实现了遍历集合查询,使用了<foreach>标签进行集合设置,主要参数:

collection:集合性质,可以是list或者array

item:每个集合元素迭代时的别名,如果元素是值,则该属性可代替本字段,如果是引用对象,则可以代替当前迭代对象,可以使用类似users.getName这种语法获取属性,open和close代表以什么开头和结尾,separator,表示以什么做分隔符

(0)

相关推荐

  • Spring整合MyBatis

    Spring整合MyBatis

  • java开发技术之tomcat的参数调优

    一般最常做的更改,就是修改服务器的端口,也就是server.xml里的Connector部分.典型如下图所示: 其实,大部分优化,也是在Connector标签之内,从端口.并发到线程,都可以在这里配置 ...

  • java开发技术之Netty几个核心类介绍

    ByteBuf JDK原生ByteBuffer的核心功能 字节缓冲区,主要对字节进行操作的一个类 能够将缓冲区建立在堆内和堆外.普通的new byte[] ,都只是建立在堆内 Netty之所以要自己封 ...

  • java开发技术之Executors创建线程池的弊端

    java开发技术之Executors创建线程池的弊端

  • java开发技术之synchronized的使用浅析

    synchronized 这个关键字的重要性不言而喻,几乎可以说是并发.多线程必须会问到的关键字了.synchronized 会涉及到锁.升级降级操作.锁的撤销.对象头等.所以理解 synchroni ...

  • java开发技术之Redis类型技能入门篇

    字符串 首先Redis数据存储都会以key value 的形式进行存放, 所有的key都是字符串类型.此处所说的类型特指的是value中存放的类型.下文所讲的hash.列表都是基于value上进行讲解 ...

  • java开发之开源平台Kafka知识总结分享

    kafka的基本体系结构 一个完整的kafka消息中间件应该包含如下几个节点: 生产者:生产消息的节点 消费者:消费消息的节点 broker:接收生产者发送消息存储的节点 zookeeper:管理维护 ...

  • Java开发中SSM框架整合开发之 Spring IoC

     Spring IoC的基本概念 控制反转(Inversion of Control,IoC)是一个比较抽象的概念,是Spring框架的核心,用来消减计算机程序的耦合问题.依赖注入(Dependenc ...

  • java开发学习路线~

    既然想做Java开发工程师,那第一步必不可少的就是Java语言 一.编程基础 1.java语言: java基本语法,面向对象,接口,容器,异常,泛型,注解,反射,I/O, jvm java高级: 并发 ...

  • 避坑指南,Java开发工程师进阶提升学习路径及误区,速戳

    Java开发工程师进阶提升学习路径及误区,Java语言目前非常流行.应用范围最广的服务端编程语言,Java开发的人才需求量大,把Java的学习过程分为四个阶段:理论阶段.开发阶段.进阶阶段.实战阶段. ...