java7-Spring笔记

182 阅读6分钟

介绍:Spring是一个轻量级的控制翻转(IOC)和面向切面编程(AOP)的框架

1、SpringBoot和SpringCloud

  • 基于SpringBoot可以快速开发单个微服务
  • SpingClould是基于SpringBoot来实现的

2、IOC(容器,依赖注入DI只是IOC实现的一种方式)

控制翻转的思想:不再用去管理对象的创建,更加专注业务上的实现

  • 没有IOC的程序中,使用面向对象进行编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制翻转后将对象的创建转移给第三方,由用户来控制要实现什么样的对象,而不需要每次修改时都要去更新代码结构 控制翻转:就是获取对象的方式反转了

2.1 使用容器

ApplicationContext是高级工厂的接口,该工厂能够维护不同 bean 及其依赖关系的注册表
对应的ClassPathXmlApplicationContext只是实现一个实现类

//拿到Spring的容器
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//获取对应的对象  对应的为在bean.xml文件中进行配置的calss类的id
//底层实现了反射
User user =(User)context.getBean("User");
user.getName();

总结:对象由Spring来创建,管理,装配

2.2、Spring配置

2.2.1 Alias

2.2.2 bean标签 //最重要的

id : bean的唯一标识,相当于对象名 class ; bean对象所对应类的权限定名字 name : 对象的别名,可以取多个,对应的Alias的一样的作用

//使用getBean获取的就是对应的id的值 若有name或者Alias则通过别名也能获取,获取的是一个对象

2.3.2 import

将多个配置文件进行集合,比如有多个人开发,对于不同的类注册在不同的.xml,利用import将所有人的beans.xml合并成一个总的,使用的时候使用一个总的配置就可以将多个不同管理的类同时注入到容器中

2.3 依赖注入的方式

2.3.1 构造器注入

//使用c命名空间的注入,可以优化

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

2.3.2 set方式注入 <重要>

//给对应的类的属性注入值

// String类型的属性的注入 
<property name="name" value="小红">
//类的注入  ref代表着引用类型的注入
<property name="address" ref="address">
//数组的注入
<property name="books">
    <array>
        <value>红楼梦</value>
        <value>西游记</value>
        <value>水浒传</value>
        <value>三国演义</value>
    </array>
</property>
//链表  list  将上面的标签array改为list
//map的注入
    <map>
        <entry key="身份证" value="34222"/> 
        <entry key="学号" value="123"/> 
        <entry key="密码" value="root"/> 
    </map>

//优化:使用P命名空间的注入,简化书写properties //在bean.xml文件上方添加

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

2.3.3 拓展方式注入

3、对象的作用域

3.1 单例模式

只会产生一个对象

//使用了C命名空间
<bean id="" calss="com.ahu.pojo.user" c:age="18" c:name="kuangshen" scope="singleton">

3.2 原型模式

每次从容器中get的时候都会产生一个新对象

//使用了C命名空间
<bean id="" calss="com.ahu.pojo.user" c:age="18" c:name="kuangshen" scope="prototype">

4、自动装配

在上面的时候所有的属性需要自己配置,下面介绍两个减少属性配置的

//byName
<bean id="people" class="com.ahu.people" autowire="byName">
    //这时候就将对应的属性值已经自动装配进去了
</bean>
//byType
<bean id="people" class="com.ahu.people" autowire="byType">
    
</bean>
  • ByName的时候,需要保证所有的bean的id值唯一,并且这个bean需要和自动注入的属性的set方法的值一致(set的后缀名字一致)
  • ByType的时候需要找与类型相同的

4.1 使用注解使用自动装配

1、导入约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
   //新增加的 
   xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
     
     ```

    <!--添加对注解的支持  指定要扫描的包-->
<context:component-scan base-package="com.ahu.pojo" />
<context:annotation-config/>
``` 2、配置中只需要添加类即可
<bean id="cat" calss="com.ahu.Cat">
<bean id="dog" calss="com.ahu.Dog">
<bean id="people" calss="com.ahu.People">

3、在people的类中加注解

@Autowired  实现自动的装配
private Dog dog;
@Autowired 
private Cat cat;

@Autowired(required = false)

注意:如果显示的定义了Autowired的required的属性为false,说明这个对象可以为null,否则不允许为空

4、@Autowired的局限性 当开发中配置的属性环境比较复杂(具有多个相同的类名字)的时候,自动装配无法通过一个注解@Autowired完成的时候,需要使用@Qualifier注解,可以唯一的指定对应的bean id

  • 通常的情况下是@Autowired+@Qualifier一起来使用

5、@Resource注解

  • 属于一个javax包下的注解,是@Autowired + @Qualifier的结合,一般较少使用

6、小结 @Resource和@Autowired的区别

  • 都是来自动装配的 (name就是对应的id)
  • @Autowired通过byType的方式实现
  • @resource默认通过byname的方式来实现,如果找不到名字,则通过byType实现,如果都找不到,则报错

5、Spring使用注解的开发

//首先:简化类的注入,之前需要在applicationContext.xml文件中进行通过bean标签来注入类
这里,直接引入一个@Component注解,直接将类进行注入到容器中,然后再通过注解进行注入对应的属性

5.1 注解

  • @Repository
  • @Controller
  • @Service
  • @Component
  • 四个注解的功能是相同的,将某个类注册的Spring的容器中

补:可以在一个类加上@Scope("singleton")为单例,或者其他的可修改

  • @Configuration代表着的是一个配置类,相当于之前的bean.xml文件
  • 在@Configuration下加@ComponentScan进行扫描将其他的比如自动配置的类和属性加入到容器中去

6、Spring AOP面向切面编程-动态代理

实现InvocationHandler接口,实现这个接口并返回结果
proxy 提供一个创建代理类的方法

  • 一个动态代理类代理的是一个接口,一般对应的是一类业务

实现

  • 1、在.xml文件中进行配置
//需要修改命名空间  //calss为定义切面的位置
<bean id="annotationPointCut" calss="com.ahu.demo.AnnotationPointCut"/>
//开启注解的支持   默认的是JDK的实现,要有接口
<aop:aspect-autoproxy>

@Aspect  //定义为切面
public class AnnotationPointcut {
    //切入点在那里
    @Before("execution(* com.ahu.service.UserServiceImpl.*(..))")
    public void before(){
        System.out.println("方法执行前");
    }
}

7、Spring整合Mybatis

1、Mybatis-Spring 第一种方式

  • 将Mybatis代码无缝的整合到Spring中,允许Mybatis参与到Spring的事务的管理中\
  • 之前还需要工具类创建对象的连接数据源,在Spring中基于IOC的作用,所有的对象的创建都有Spring来决定
  • Spring首先接管数据源,通过数据源创建SQLSessionFactory(之前的通过SQLSessionFactoryBuilder创建),接管之后,需要得到SQLsession的对象,这里创建的是SQLSessionTemplate
  • 新增一个类,来实现接口中的方法
private SqlSessionTemplate sqlSession;
//通过set方法将sqlSession的对象进行注入
//通过之前Mybatis的执行步骤
1、获取接口的对应的是实现UserMapper
2、这时已经获得对应的实现类
3、调用合适的方法

2、第二种方式 SqlSessionDaoSupport 是一个抽象的支持类,用来提供SqlSession,调用getSqlSession()方法会得到一个SqlSeesionTemplate,之后执行对应的SQL方法

public class UserDaoImpl extends SqlSessionDaoSupport implents UserDao{
    public User getUser(String userId){
        return getSqlSession().selectOne("",userId);
    }
}

3、事务

一个使用 MyBatis-Spring 的其中一个主要原因是它允许 MyBatis 参与到\Spring 的事务管理中。而不是给 MyBatis 创建一个新的专用事务管理器,MyBatis-Spring 借助了 Spring的DataSourceTransactionManager 来实现事务管理。

  • 声明式事务:AOP
  • 编程式事务:改变代码(一般不用)