SSM框架
SSM= Spring+SpringMVC+mybatis
SSH= Spring+struct2+Hibernate
Spring
-
一个轻量级、非入侵的控制反转(IOC)和面向切面(AOP)容器框架
-
雏形是interface21框架
-
框架创始人Rod Johnson的轮子理论:不要重复发明轮子
-
Spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架
-
Spring是一个开源的免费的框架 (容器)
-
支持事务的处理
Springboot
-
一个快速开发的脚手架
-
基于Springboot可以快速开发单个微服务
-
约定大于配置
SpringCloud
- 基于Springboot实现的
学习Springboot的前提:完全掌握Spring及SpringMVC
但是,由于发展太久,Spring配置十分繁琐(弊)
IOC(设计思想)
由主动的编程变成被动的接收,对象由Spring创建、管理、装配
传统开发:用户的需求会影响代码,因此程序员需要根据用户的需求去更改代码,修改代价昂贵
UserDao接口
UserDaoImpl实现类
UserService业务接口
UserServiceImpl业务实现类
IOC创建对象
默认使用无参创建对象
使用有参构造:
-
下标赋值:在XML中使用
<bean id="user" class="com.yuanyu.pojo.User"> <constructor-arg index="0" value="XXXXXX"/> </bean>
-
使用类型赋值:(不建议使用)
<bean id="user" class="com.yuanyu.pojo.User"> <constructor-arg type="java.lang.String" value="XXXXXX"/> </bean>
-
直接通过参数名来设置:
<bean id="user" class="com.yuanyu.pojo.User"> <constructor-arg name="name" value="XXXXXX"/> </bean>
在配置文件加载的时候,容器中管理的对象就已经初始化了
Spring配置
alias别名
若添加了别名,也可以使用别名来获取对象
<alias name="user" alias="userNew"/>
Bean的配置
id:bean的唯一标识符,相当于对象名
class:bean对象所对应的全限定名
name:别名,且name可以同时取多个别名
<bean id="user" class="com.yuanyu.pojo.User" name="u1,u2 u3;u4">
<propery name="name" value="XXX"/>
</bean>
import
一般用于团队开发使用,可以将多个配置文件合并为一个(applicationContext.xml)
<import resource="beans.xml"/>
依赖注入
- 构造器注入
- set方式注入
- 扩展方式注入:使用P命名空间、C命名空间(需要导入XML约束)
Bean的作用域
-
单例模式(Spring默认机制)
<bean id="user" class="com.yuanyu.pojo.User" c:age="17" c:name="yuanyu" scope="singleton"/>
-
原型模式:每次从容器中get的时候,都会产生一个新对象
<bean id="user" class="com.yuanyu.pojo.User" scope="prototype"/>
-
其余的request、session、application只能在web开发中使用
Bean的自动装配
自动装配是Spring满足bean依赖的一种方式,Spring会在上下文中自动寻找,并自动给bean装配属性
-
在XML中显示配置
-
在java中显示配置
-
隐式的自动装配bean
byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid
需要保证所有beanid唯一,并且这个bean需要和自动注入的属性的set值一致
byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean
需要保证所有beanclass唯一,并且这个bean需要和自动注入的属性的类型一致
<bean id="cat" class="com.yuanyu.pojo.Cat"/> <bean id="dog" class="com.yuanyu.pojo.Dog"/> <bean id="people" class="com.yuanyu.pojo.People" autowire="byName"> <property name="name" value="yuanyu"/> </bean>
-
使用注解实现自动装配
在Spring4之后,要是用注解开发,必须保证aop的包导入了
使用:
-
<context:annotation-config/>开启注解
-
@Autowired直接在类的属性上使用即可(使用后可以省略set方法);也可以在set方法上使用
通过byType方式实现,而且必须要求对象存在
- 如果显示定义了Autowired的require=false,说明这个对象可以为Null,否则不允许为空
- 如果@Autowired自动装配的环境比较复杂,自动装配无法通过@Autowired一个注解完成时,可以使用@Qualifier(value="XXX")去配合@Autowired的使用,指定一个唯一的bean对象注入
-
@Resource默认通过byName方式实现,如果找不到名字,则通过byType实现 ,若两个都找不到则报错
-
@Nullable说明该字段可以为null
-
@Scope("prototype")
-
@Component衍生注解:在web开发中,会按照MVC三层架构分层
- dao【@Repository】
- service【@Service】
- controller【@Conreoller】
以上四个注解的功能都是一样的,都是代表将某个类注册到Spring中,装配Bean
<?xml ...> <beans xmlns= xmlns:xsi= xmlns:context= xsi:schemaLocation=...> 指定要扫描的包,这个包下的注解就会生效 <context:component-scan base-package="com.yuanyu.pojo"/> <context:annotation-config/> </beans>
@Component public class User{ public String name; @Value("yuanyu") public void setName(String Name){ this.name=name; } }
-
XML与注解的最佳实践:注解只负责完成属性的注入,XML用来管理bean
使用java方式配置Spring
javaConfig是Spring的一个子项目,在Spring4之后变成了核心功能
在config文件夹下创建的Config类中加入@Configuration ;类中的方法前加入@Bean
在pojo文件下的User类中加入@Component 表示该类已被Spring接管,注册在了容器中
AOP
任何一个系统都是由不同的组件组成,每个组件负责一块特定的功能,会存在很多组件是跟业务无关的,例如:日志、事务、权限等核心服务组件作为一个切面,注入到目标对象中,不需要修改原有的业务逻辑代码,通过动态代理的方式,将需要注入切面的对象进行代理,降低了代码的耦合度。
静态代理
-
抽象角色
-
真实角色
-
代理角色
-
客户
优:
- 使真实角色的操作更加纯粹,不用关注公共业务
- 公共业务交给代理角色,实现了业务的分工
- 公共业务发生扩展的时候,方便集中管理
缺:
- 一个真实角色会产生一个代理角色,代码量会翻倍,开发效率变低
步骤:
-
接口
//租房 public interface Rent{ public void rent(); }
-
真实角色
//房东 public class Host implements Rent{ public void rent(){ System.out.println("房东要卖房子了"); } }
-
代理角色
//中介 public class Proxy implements Rent{ private Host host; public Proxy(){ } public Proxy(Host host){ this.host=host; } public void rent(){ host.rent(); seeHouse(); hetong(); fare(); } public void seeHouse(){ System.out.println("中介带你看房"); } public void hetong(){ System.out.println("签合同"); } public void fare(){ System.out.println("收中介费"); } }
-
客户端访问代理角色
public class Client{ public static void main(String[] args){ Host host=new Host(); Proxy proxy=new Proxy(host); proxy.rent(); } }
动态代理
动态代理的类是动态生成的,不是直接写的(实质:使用反射机制实现)
优:
- 使真实角色的操作更加纯粹,不用关注公共业务
- 公共业务交给代理角色,实现了业务的分工
- 公共业务发生扩展的时候,方便集中管理
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理类可以代理多个类,只要是实现了同一个接口即可
SpringMVC
MVC:模型(dao+service)+视图(JSP)+控制器(servlet)
一种架构模式:将业务逻辑、数据、显示分离的方法来组织代码;降低了视图与业务逻辑的双向耦合
Mybatis
Mybatis是一款优秀的持久层(内存中的数据断点易失,需要存起来)框架,支持定制化SQL、存储过程以及高级映射;避免了jdbc代码和手动设置参数以及获取结果集。可以使用简单的XML和注解来配置和映射原生类型,接口和pojo为数据库中的记录
优:
- 本身小、简单易学
- 灵活:,SQL写在XML里,便于统一管理和优化,解除SQL与程序代码的耦合
步骤:
-
导依赖pom.xml
- mysql驱动
- mybatis
- Junit
- 在build中配置resources
-
连接数据库
-
编写实体类
public class User{ private int id; private String name; private String pwd; set...get... }
-
resources下编写核心配置文件mybatis-config.xml
- 连接数据库
- 注册mapper接口:每一个mapper.xml都需要在mybatis核心配置文件中注册
-
在mapper下编写接口UserMapper
public interface UserMapper{ public List<User> selectUser(); }
-
在mapper下编写Mapper.xml
<?...?> <!...> <mapper namespace="com.yuanyu.mapper.UserMapper"> <select id="selectUser" resultType="user"> select * from mybatis.user; </select> </mapper>
-
在test下测试
public class MyTest{ @Test public void test(){ //获得sqlSession对象 String resources="mybatis-config.xml"; InputStream in=Resources.getResourceAsStream(resources); sqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(in); SqlSession sqlSession=sessionFactory.openSession(true); //执行sql sqlSession.getMapper(UserMapper.class); ... } }