SSM Spring容器 核心功能IOC 简单的开发(XML、注解)

# Spring

1. Spring框架简介

一句话总结:Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!

优点:

  • 轻量
    Spring 框架使用的 jar 都比较小,一般在 1M 以下或者几百 kb。 Spring 核心功能的所需
    的 jar 总共在 3M 左右。
    Spring 框架运行占用的资源少,运行效率高。不依赖其他 jar
  • 针对接口编程,解耦合
    Spring 提供了 Ioc 控制反转,由容器管理对象,对象的依赖关系。原来在程序代码中的
    对象创建方式,现在由容器完成。对象之间的依赖解耦合。
  • AOP编程(面向切面编程)的支持
    通过 Spring 提供的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现
    的功能可以通过 AOP 轻松应付
    在 Spring 中,开发人员可以从繁杂的事务管理代码中解脱出来,通过声明式方式灵活地
    进行事务的管理,提高开发效率和质量。
  • 方便集成各种优秀框架
    不排斥各种优秀的开源框架,相反 Spring 可以降低各种框架的使用难度, Spring
    提供了对各种优秀框架(如 Struts,Hibernate、 MyBatis)等的直接支持。简化框架的使用。
    Spring 像插线板一样,其他框架是插头,可以容易的组合到一起。需要使用哪个框架,就把
    这个插头放入插线板。不需要可以轻易的移除。

2. 核心功能IOC 控制反转

原来的程序开发的时候,每次当客户的需求发生变化的时候,就需要程序人员改动原来的代码,就存在很大的问题。 问题就是程序适应不了用户需求的变更
控制反转的思想就是让程序适应用户需求的变化,交给用户来选择要调用DAO层的东西
这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。 系统的耦合性大大降低,可以更加专注于业务的实现上,这是IOC的原型!

本质:
控制反转是一种设计思想,DI(依赖注入)是实现IOC的一种方式,在没有IOC的程序中,我们使用面向对象编程,对象的创建于对对象间的依赖关系完全硬编码在程序中,对象的创建有程序自己控制,控制反转后将对象的创建转移给第三方,个人认为控制反转就是:获得依赖对象的方式反转了。

IOC是Spring框架的核心内容,使用多种方式完美的实现了IOC,可以使用xml配置,也可以使用注解,新版本的Spring也可以零配置实现IOC

Spring容器在初始化时线读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从IOC容器中取出需要的对象

控制反转时一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的时IOC容器,其实现方式时依赖注入。

3. IOC的案例(xml配置)

1.首先是maven创建项目(quickStart骨架创建),完成相关的包的补全之后,在pom.xml文件下导入相关的依赖:

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

部分插件:

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>

  </build>

2.定义接口和它的实现类,这个是避免不了的用service层调用方法的
接口:

public interface SomeService {
    void doSome();
}

实现类:

public class SomeServiceImpl implements SomeService {
    @Override
    public void doSome() {
        System.out.println("====业务方法doSome()===");
    }
    public SomeServiceImpl() {
        super();
        System.out.println("SomeServiceImpl无参数构造方法");
    }
}

  1. 在resourses的文件夹下创立一个xml文件,名称是定为appliacationContext.xml(Spring官方推荐的,文件格式可以在官网上找到,然后可以在idea中创建一个模板来做),是需要在这个文件中注册bean对象,相当于给出需要的对象的一个描述,IOC容器通过这个bean标签里面的描述来自己生成对象,交付给程序进行使用
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="someservice" class="com.bjpowernode.impl.SomeServiceImpl"></bean>
</beans>

注册bean对象,id:自定义对象的名称,通过id在代码中使用对象,class:类的全限定名称,不能是接口,要是接口的实现类
(我理解是,ioc容器是要借助这一bean标签生成一个对象类来调用接口中规定的方法,实现功能)
有些时候,bean的标签中需要赋值一些属性的:这里是下面要讲的注入的内容

<bean id="mystudent" class="com.bjpowernode.Student">
        <property name="age" value="20"/>
        <property name="name" value="lisi"/>
        <property name="school" ref="myschool"/>
    </bean>
    <bean id="myschool" class="com.bjpowernode.School">
        <property name="name" value="uestc"/>
    </bean>

对于一些简单类型的值的赋值,直接用Value即可,对于相关联的对象的,使用ref来赋值,如上所示

4.在配置好applicationContext.xml文件后,便可以进行测试了

public void test02(){
        String resource="applicationContext.xml.xml";
        ApplicationContext ac=new ClassPathXmlApplicationContext(resource);
        SomeService service=(SomeService) ac.getBean("someservice");
        service.doSome();

    }

将Spring的配置文件放在类路径下,用一个字符串给给记录上对应的路径,然后利用ClassPathXmlApplicationContext()方法给创建出来Spring容器,然后使用ApplicationContext(这个对象是Spring容器中的中央调度器,完成对应的bean调度,也和配置文件名称相同,也表示了配置文件配置的就是这么个对象)的getBean方法拿到一个实现类,拿到的是一个object类,要进行强转之后直接调用里面的方法就可以了。

注意:ApplicationContext 容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。默认是调用的无参构造方法来创建对象,也可以用有参构造的方法来获取对象
以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。

4. IOC创建对象的方式

  • 第一种就是默认使用无参构造方法创建对象
  • 当写入了有参构造方法将无参构造方法给覆盖之后,可以使用有参构造方法来实现(官网上也有)
    1.下标赋值:
<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg index="0" value="7500000"/>
    <constructor-arg index="1" value="42"/>
</bean>

2.根据参数类型进行处理(不建议使用,一般碰到相同类型的参数在进行传参的时候就很鸡肋)

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="7500000"/>
    <constructor-arg type="java.lang.String" value="42"/>
</bean>

简单数据类型直接用type中写入就可以,对于引用数据类型,type中写入全限定名称,然后进行ref处理

3.直接通过参数值进行设置

<beans>
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg ref="beanTwo"/>
        <constructor-arg ref="beanThree"/>
    </bean>

    <bean id="beanTwo" class="x.y.ThingTwo"/>

    <bean id="beanThree" class="x.y.ThingThree"/>
</beans>

小结:一种无参构造方法,和三种有参构造方法是IOC容器创建对象的全部方式

5. DI依赖注入

5.1 构造器注入:

上面已经讲过了,就是在bean标签里面使用多种方法,调用该接口实现类的构造器方法就可以实现注入

5.2 Set注入(重点)

依赖注入:set注入

  • 依赖:bean对象的创建依赖于容器
  • 注入:bean对象的所有属性,由容器来注入!

要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is

在官网中提供了 许多种情况,分别是包括了字符串、数组、其他等情况
这里面借助狂神说的一篇博客中有一些主要的描述:
https://blog.csdn.net/qq_33369905/article/details/106647271?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166290182716782414923128%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166290182716782414923128&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-8-106647271-null-null.article_score_rank_blog&utm_term=Spring&spm=1018.2226.3001.4450

这篇文章详细描述了set注入的各种情,也可以是看官方文档将对应的情况进行描述

6. 注解开发

上面讲到了使用xml配置文件来完成对应的javaBean 对象的注册,但在实际的开发中,主要还是使用的注解进行开发,可以直接在程序中使用简单的标签来完成对于bean对象的属性赋值
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 bean 实例。Spring 中使用注解,
需要在原有 Spring 运行环境基础上再做一些改变。
需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解

1.需要导入一些包,在ApplicationContext.xml文件上完成对应的配置,并将组件扫描器component-scan给注册进xml文件中

<?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.bjpowernode.dao"/>
 
</beans>

2.需要在类上面加上注释来完成对于bean的定义,进而可以利用组件扫描器可以查找到,让IOC容器来生成对象

  • @Component 用于定义bean,他的属性value 是用于指定该bean的id值
@Component("user")
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
public class User {
    public String name = "秦疆";
}

@Component三个衍生注解

为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。

  1. @Controller:web层

  2. @Service:service层

  3. @Repository:dao层

  • @Value 用于简单类型属性的值的赋值
@Component("user")
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
public class User {
    @Value("秦疆")
    // 相当于配置文件中 <property name="name" value="秦疆"/>
    public String name;
}
  • @Autowired 用于对于引用属性按类型自动装配Bean
    在这里插入图片描述
  • @Autowired+@Qualifier 用于对于引用属性按名称自动装配Bean
    在这里插入图片描述
  • @Resource 用于自动注入
    Spring提供了对 jdk中@Resource注解的支持。@Resource 注解既可以按名称匹配Bean,也可以按类型匹配 Bean。 默认是按名称注入。 使用该注解,要求 JDK 必须是 6 及以上版本。
    @Resource 可在属性上,也可在 set 方法上。
    在这里插入图片描述
    在这里插入图片描述

7. 注解与XML的对比

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值