SSM

SSM框架

SSM= Spring+SpringMVC+mybatis

  • Spring负责管理SpringMVC和mybatis相关对象的创建和依赖的注入

  • SpringMVC负责实现MVC设计模式

  • mybatis负责数据持久层



Spring

  • 一个轻量级非入侵控制反转(IOC)面向切面(AOP)容器框架

  • 雏形是interface21框架

  • 框架创始人Rod Johnson的轮子理论:不要重复发明轮子

  • Spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架

  • Spring是一个开源的免费的框架 (容器

  • 支持事务的处理

Springboot

  • 一个快速开发的脚手架

  • 基于Springboot可以快速开发单个微服务

  • 约定大于配置

SpringCloud

  • 基于Springboot实现的

学习Springboot的前提:完全掌握Spring及SpringMVC

但是,由于发展太久,Spring配置十分繁琐(弊)


IOC(设计思想)

由主动的编程变成被动的接收,对象由Spring创建、管理、装配

传统开发:用户的需求会影响代码,因此程序员需要根据用户的需求去更改代码,修改代价昂贵

UserDao接口

UserDaoImpl实现类

UserService业务接口

UserServiceImpl业务实现类


IOC创建对象

默认使用无参创建对象

使用有参构造:

  1. 下标赋值:在XML中使用

    <bean id="user" class="com.yuanyu.pojo.User">
    	<constructor-arg index="0" value="XXXXXX"/>
    </bean>
    
  2. 使用类型赋值:(不建议使用)

    <bean id="user" class="com.yuanyu.pojo.User">
    	<constructor-arg type="java.lang.String" value="XXXXXX"/>
    </bean>
    
  3. 直接通过参数名来设置:

    <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"/>

依赖注入

  1. 构造器注入
  2. set方式注入
  3. 扩展方式注入:使用P命名空间、C命名空间(需要导入XML约束)

Bean的作用域

  1. 单例模式(Spring默认机制)

    <bean id="user" class="com.yuanyu.pojo.User" c:age="17" c:name="yuanyu" scope="singleton"/>
    
  2. 原型模式:每次从容器中get的时候,都会产生一个新对象

    <bean id="user" class="com.yuanyu.pojo.User" scope="prototype"/>
    
  3. 其余的request、session、application只能在web开发中使用


Bean的自动装配

自动装配是Spring满足bean依赖的一种方式,Spring会在上下文中自动寻找,并自动给bean装配属性

  1. 在XML中显示配置

  2. 在java中显示配置

  3. 隐式的自动装配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>
    
  4. 使用注解实现自动装配

    在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

任何一个系统都是由不同的组件组成,每个组件负责一块特定的功能,会存在很多组件是跟业务无关的,例如:日志、事务、权限等核心服务组件作为一个切面,注入到目标对象中,不需要修改原有的业务逻辑代码,通过动态代理的方式,将需要注入切面的对象进行代理,降低了代码的耦合度。

静态代理

  • 抽象角色

  • 真实角色

  • 代理角色

  • 客户

优:

  • 使真实角色的操作更加纯粹,不用关注公共业务
  • 公共业务交给代理角色,实现了业务的分工
  • 公共业务发生扩展的时候,方便集中管理

缺:

  • 一个真实角色会产生一个代理角色,代码量会翻倍,开发效率变低

步骤:

  1. 接口

    //租房
    public interface Rent{
    
      	public void rent();
      	
    }
    
  2. 真实角色

    //房东
    public class Host implements Rent{
      
      	public void rent(){
          	System.out.println("房东要卖房子了");
      	}
    }
    
  3. 代理角色

    //中介
    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("收中介费");
      	}
    }
    
  4. 客户端访问代理角色

    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与程序代码的耦合

步骤:

  1. 导依赖pom.xml

    • mysql驱动
    • mybatis
    • Junit
    • 在build中配置resources
  2. 连接数据库

  3. 编写实体类

    public class User{
      private int id;
      private String name;
      private String pwd;
      
      set...get...
      
    }
    
  4. resources下编写核心配置文件mybatis-config.xml

    • 连接数据库
    • 注册mapper接口:每一个mapper.xml都需要在mybatis核心配置文件中注册
  5. 在mapper下编写接口UserMapper

    public interface UserMapper{
      public List<User> selectUser();
    }
    
  6. 在mapper下编写Mapper.xml

    <?...?>
    <!...>
    <mapper namespace="com.yuanyu.mapper.UserMapper">
    	<select id="selectUser" resultType="user">
    		select * from mybatis.user;
    	</select>
    </mapper>	
    
  7. 在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);
        ...
      }
    }
    
posted @ 2023-03-18 12:33  原语  阅读(30)  评论(0编辑  收藏  举报