SSM——spring——loc——day01

1、什么是框架:  2、如何学习框架:  3、Spring是什么: 

 4、Spring的优势: 5、 Spring结构

6、Spring核心概念(loC)控制反转:    7、Spring入门案例: 

8、Spring核心-loc:非自定义对象的创建        9、Spring核心-loc:创建对象的三种方式

10、Spring核心-loc-基于xml的DI             11、Spring核心-IoC-基于注解实现IoC

12、  Spring核心-IoC-属性注入的注解实现      13、Spring核心-IoC-总结

1、什么是框架:

          在软件设计中指为解决一个开放性问题而 设计的具有一定约束性的支撑结构。在此结构上              可以根据具体问题扩展、安插更多的组成部分,从而更 迅速和方便地构建完整的解决问题              的方案。

2、如何学习框架:

          1)知道框架能做什么

          2)学习框架的语法,一般框架完成一个功能需要一定的步骤

          3) 框架的内部实现原理(扩展)
          4) 尝试实现一个框架(提升)
3、Spring是什么:
        1)  是一个是分层的 Java SE/EE full-stack 开源 轻量级 Java 开发框架, 是 最受欢迎                    的企业级 Java 应用程序开发框架
        2) Spring 具有 控制反转 IoC )和 面向切面 AOP )两大核心。 Java Spring 框架通过声明                  式方式灵活地进 事务的管理 ,提高开发效率和质量。
 
        3)控制反转:以前对象都是我们自己通过 new 来创建的,现在我们将这个创建对象的权力
              交给Spring,他给我们创建,我们直接用就可以了。
        
        4)面向切面:让日志和事务这类服务性的代码,重复性特别高的代码,单独把他们拿出来,
              单独去进行编写,然后让业务层只是去处理我们核心的业务逻辑。最后把两者加在一起
              去运行。面向切面就是去解决这种问题的,核心的业务就只去处理核心的业务,像事务
               权限,日志这种,我们也要去用,但是重复性的东西要把他们提取出来,作为一个切面
               实际上也是一个类。
      
        5)Spring 框架不仅限于服务器端的开发,很多的框架都可以和Spring结合起来使用,通过
              配置文件.xml 这种进行配置就可以了。Spring不仅自己优秀,也对其他优秀的框架进行
              了包容,这也是Spring大势发展的原因之一。
4、Spring的优势:
       
       1) 方便解耦,简化开发 。Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维                 护交给 Spring 管理。
       2) 方便集成各种优秀框架 。Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀
             框架(如 Struts2 Hibernate 、 MyBatis 等)的直接支持。
       3) 降低 Java EE API 的使用难度 。Spring 对 Java EE 开发中非常难用的一些 API JDBC 、              JavaMail 、远程调用等)都提供了封装, 使这些 API 应用的难度大大降低。
       4) 方便程序的测试 。Spring 支持 JUnit4 ,可以通过注解方便地测试 Spring 程序。
       5) AOP 编程的支持 。Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和
            运行监控等功能。
       6) 声明式事务的支持 。只需要通过配置就可以完成对事务的管理,而无须手动编程。

5、 Spring体系结构:Spring 为我们提供了一站式解决方案,但Spring 是模块化的,允许咱们挑

       选和选择适用于项目的模块, 不需要把剩余部分也引入。 Spring 框架提供约 20 个模块,

       可以根据应用程序的要求来选择。

6、Spring核心概念(loC)控制反转:

        1)Ioc—Inversion of Control,即控制反转,不是什么技术,而是一种设计思想。 IoC 是

              指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器                会负责控 制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转                  移到了 Spring 容器中,控 制权发生了反转,这就是 Spring IoC 思想。

7、Spring入门案例:

         1)目的:让Spring自己去给我们创建一个对象

         2)流程:

                     1…创建一个实体类Team

                     2…在java包下的resource下创建一个 Spriing 的 XML 文件

import com.zj.bean.Team;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;

public class Test01 {
    @Test
    public void test01(){
        //没有使用Spring时候测试    Team team = new Team();
        //使用 Spring 容器创建对象

        //1.获得配置文件的名字
        String springConfig = "application.xml";
        //2.获取容器
        //这句话执行完毕,我们就得到了类的对象了
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(springConfig);
        //获取类的对象
        Team team = (Team) applicationContext.getBean("team");

         //Spring中常用的API
        //获取配置文件中对象的个数
        int count = applicationContext.getBeanDefinitionCount();
        System.out.println(count);

        //获取配置文件中对象的名字
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }

        //方式二:创建对象
        BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("配置文件的绝对路径"));
        beanFactory.getBean("team");

        //方式三:创建对象
        ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("配置文件的绝对路径");
    }
}

 8、Spring核心-loc:非自定义对象的创建

和自定义的对象是相同的操作

在application.xml中:<bean id="date" class="java.util.Date"></bean>

在测试类中:applicationConfig.getBean("date");

9、bean标签的属性:

 实例演示:

Team 实体类补充如下方法:
public void init() {
        System.out.println("Team ---- init()");
    }

    public void destroy() {
        System.out.println("Team ---- destroy()");
    }
application.xml 配置文件添加如下内容:
 <!--bean标签的属性: 
    id="自定义的对象名称" ,要求唯一 
    name="bean对于的一个标识“,一般使用id居多 
    class="类的完全限定名" 
    scope="singleton/prototype" 单例/多例 
          singleton:默认值,单例:在容器启动的时候就已经创建了对象,而且整个容器只有为一个 的一个对象 
          prototype:多例,在使用对象的时候才创建对象,每次使用都创建新的对象 
   lazy-init="true/false" 是否延迟创建对象,只针对单例有效 
          false:不延迟创建对象,容器加载的时候立即创建 
          true:默认加载,使用对象的时候才去创建对象 
   init-method="创建对象之后执行的初始化方法" 
   destroy-method="对象销毁方法,调用容器destroy方法的时候执行" -->

<bean id="team2" class="com.kkb.pojo.Team" scope="singleton" lazy- init="true" init-method="init"
          destroy-method="destroy"/>
    <bean id="team3" class="com.kkb.pojo.Team" scope="prototype"/>
 @Test
    public void test02() {
        String springConfig = "application.xml";
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(springConfig);
        Team team1 = (Team) applicationContext.getBean("team1");
        Team team11 = (Team) applicationContext.getBean("team1");
        System.out.println(team1);
        System.out.println(team11);
        Team team2 = (Team) applicationContext.getBean("team2");
        Team team22 = (Team) applicationContext.getBean("team2");
        System.out.println(team2);
        System.out.println(team22);
        applicationContext.close();//关闭容器 }
    }

9、Spring核心-loc:创建对象的三种方式

1、创建工厂实体类

public class MyFactory {

    /**
     * 实例方法
     * @return
     */
    public Team instanceFun(){
        return new Team(1,"勇士","荆州");
    }

    /**
     * 静态方法
     * @return
     */
    public static Team staticFun(){
        return new Team(2,"小牛","迈阿密");
    }

//    public static void main(String[] args) {
//        //创建静态对象
//        Team team01 = MyFactory.staticFun();
//        //创建实例对象
//        MyFactory myFactory = new MyFactory();
//        Team team02 = myFactory.instanceFun();
//
//    }
}

2、配置文件createType.xml

    <!--
    创建对象的三种方法:
    1、通过默认的构造方法
    2、通过带参的构造方法
    3、通过工厂方法
    -->


<!--    1、通过默认的构造方法-->
    <bean id="team01" class="com.zj.bean.Team"></bean>


<!--    2、通过带参的构造方法-->
    <bean id="team02" class="com.zj.bean.Team">
        <!--index:表示参数的下标索引值-->
        <constructor-arg index="0" value="01"/>
        <constructor-arg index="1" value="勇士队"/>
        <constructor-arg index="2" value="荆州"/>
    </bean>

    <bean id="team03" class="com.zj.bean.Team">
        <!--name:表示对象的属性-->
        <constructor-arg name="id" value="02"/>
        <constructor-arg name="name" value="公牛"/>
        <constructor-arg name="location" value="迈阿密"/>
    </bean>


<!--    3、通过工厂方法-->
    <!--3.1、通过静态的方法   Team team01 = MyFactory.staticFun();-->
    <bean id="staticTeam" class="com.zj.bean.MyFactory" factory-method="staticFun"></bean>

    <!--3.2、通过实例的方法
        MyFactory myFactory = new MyFactory();
        Team team02 = myFactory.instanceFun();
    -->
    <!--创建一个对象-->
    <bean id="myFactory" class="com.zj.bean.MyFactory"></bean>
    <bean id="instanceFun" factory-bean="myFactory" factory-method="instanceFun"></bean>
    
</beans>

3、测试类 

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class createTypeTest {

    @Test
    public void test01(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("createType.xml");
    }
}

10、Spring核心-loc-基于xml的DI

1)DI:Dependency Injection,即依赖注入:是组件之间依赖关系由容器在运行期决定,形象的               说,即 由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统                 带来更多功能,而是为 了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平                     台。通过依赖注入机制,我们只需要通过 简单的配置,而无需任何代码就可指定目标                     需 要的资源,完成自身的业务逻辑,而不需要关心具体的资 源来自何处,由谁实现。                     IoC是一个概念,是一种思想,其实现方式多种多样。依赖注入就是其中用的比较多的一                 种方式。

2)IocDI是同一个概念的不同角度描述IoC是一种思想,概念,DI是实现它的手段。Spring框        架使用依赖注入实现IoC. Spring 容器是一个超级大工厂,负责创建、管理所有的 Java 对象,        这些 Java 对象被称为 Bean。 Spring 容器管理着容器中 Bean 之间的依赖关系,Spring 使            用  依赖注入的方式来管理 Bean 之间的依赖关系。使用 IoC 实现对象之间的解耦和。

3)注入:bean 实例在调用无参构造器创建对象后,就要对 bean 对象的属性进行初始化。初始化                  是由容器自动完成的,称为注入。

4)注入的分类:

通过一个简单的案例来说明:现在有一个dao,还有一个servce,在servce里面,我们要使用到dao,这个时候我们采用Spring的方式来实现它。

            1)通过set方法

dao层:

public class TeamDao {
    public void add(){
        System.out.println("TeamDao------add-----------");
    }
}

service层:

我们需要在service层中创建一个setDao的方法。

import com.zj.dao.TeamDao;
public class TeamServlet {
    private TeamDao teamDao;

    public void add(){
        teamDao.add();
    }

    public void setTeamDao(TeamDao dao){
        this.teamDao = dao;
    }
}

在配置文件中依赖注入:


    <bean id="testDao" class="com.zj.dao.TeamDao"></bean>
    <bean id="testServlet" class="com.zj.servlet.TeamServlet">
        <!--使用set方法注入属性值-->
        <property name="teamDao" ref="testDao"></property>
    </bean>

编写测试:

 @Test
    public void test01(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("DI.xml");
        TeamServlet testServlet = (TeamServlet) applicationContext.getBean("testServlet");
        testServlet.add();
    }

         2)通过构造方法注入

在servce层中,添加他的带参构造方法:

import com.zj.dao.TeamDao;
public class TeamServlet {
    private TeamDao teamDao;

    public void add(){
        teamDao.add();
    }

    public TeamServlet() {
    }

    public TeamServlet(TeamDao teamDao) {
        this.teamDao = teamDao;
    }
}

在配置文件中加入:(此处的name属性就是我们service中的变量值)

  <bean id="testDao" class="com.zj.dao.TeamDao"></bean>

    <!--使用构造方法注入属性值-->
    <bean id="testServlet2" class="com.zj.servlet.TeamServlet">
        <property name="teamDao" ref="testDao"></property>
    </bean>

测试类:

 @Test
    public void test01(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("DI.xml");
        TeamServlet testServlet = (TeamServlet) applicationContext.getBean("testServlet");
        testServlet.add();

        TeamServlet testServlet2 = (TeamServlet) applicationContext.getBean("testServlet2");
        testServlet2.add();

    }

        3)自动注入:(两种形式)

配置文件:

    <bean id="testDao" class="com.zj.dao.TeamDao"></bean>

    <bean id="testServlet3" class="com.zj.servlet.TeamServlet" autowire="byName" >
        <!--使用自动注入的方式-->
    </bean>

过程描述:当加入autowire=“byName”这个属性之后,系统监测到class这个属性里面的值,就会去里面找到这个类的成员变量testDao,他会和id=“testDao”进行匹配,匹配成功后,我们可以直接将她注入到我们的当前这个对象中。

对于autowire="byType"来说,是比较类型,当有两个相同类型的对象在xml文件中被创建,就会直接报错,这个就存在很大的弊端。

11、Spring核心-IoC-基于注解实现IoC

用一个小小的案例来说明吧!

dao类

import org.springframework.stereotype.Component;
//在类上添加注解@Component表示该类创建对象的权限交给Spring容器。注解的value属性用于指定bean的id值,value可以省略。
//@Component 不指定 value 属性,bean 的 id 是类名的首字母小写。
@Component
public class TeamDao {
    public void add(){
        System.out.println("TeamDao------add-----------");
    }

    public TeamDao(){
        System.out.println("TeamDao----------默认的构造方法执行了------------");
    }
}

写一个annotation.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
">

    <!--表示告知Spring要扫描的包
        这些包或者子包当中的类使用了Component注解,都交给Spring来创建类的对象
    -->
    <context:component-scan base-package="com.zj.dao"></context:component-scan>


</beans>

写测试类:

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test03 {

    @Test
    public void test01(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("annotation.xml");
    }
}
1)除此之外, Spring 中还提供了其他 3 个用于创建对象的注解:
        @Repository : 用于 dao 实现类的的注解
        @Service: 用户 service 实现类的注解
        @Controller: 用于 controller 实现类的注解
这三个注解与@Component 都可以创建对象,但这三个注解还有其他的含义, @Service 创建业务层对 象,业务层对象可以加入事务功能,@Controller 注解创建的对象可以作为处理器接收用户的请求。 @Repository, @Service @Controller 是对 @Component 注解的细化,标注不同层的对象。即持久 层对象,业务层对象,控制层对象。
2) 包扫描
         1) 使用多个 context:component-scan 指定不同的包路径
         2) 指定 base-package 的值使用分隔符
          3) base-package 是指定到父包名

12、  Spring核心-IoC-属性注入的注解实现

1)对于自定义的类如何赋值:

实体类:采用value值的形式复制,有两种形式,可以直接用到setter上

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 球队的实体类
 */
@Component
public class Team {
    @Value("001")
    private Integer id;
    @Value("蒲公英队")
    private String name;
    @Value("成都信息工程大学")
    private String location;

    public Team(Integer id, String name, String location) {
        this.id = id;
        this.name = name;
        this.location = location;
        System.out.println("Team-----------全参构造方法"+id+","+name+","+location);
    }

    public Team() {
        System.out.println("Team-----------默认的构造方法");
    }

    public void init() {
        System.out.println("Team ---- init()");
    }

    public void destroy() {
        System.out.println("Team ---- destroy()");
    }

    @Override
    public String toString() {
        return "Team{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", location='" + location + '\'' +
                '}';
    }
}
  @Value("1")
    public void setId(Integer id) {
        this.id = id;
    }

配置文件:你要配置他的包名

<context:component-scan base-package="com.zj.bean"></context:component-scan>

测试类:

import com.zj.bean.Team;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test04 {
    @Test
    public void test01(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("annotation.xml");
        Team team = (Team) applicationContext.getBean("team");
        System.out.println(team);
    }
}

2)对于引用类型:

方法一:添加注解@Autowired,实现自动装配(可以放在属性上,也可以放在setter方法上)

 

当required=false时,如果没有扫描到teamDao的话,将他置为Null,会报空指针异常。如果为true,并且没有扫描到的话,直接报错。 

 方法二:使用jdk中的@resource注解

也可以自己去指定名字和类型 

13、 Spring核心-IoC-总结

 loC 的思想就是让 Spring 容器去给我们创建对象。有两个方法,第一个是使用 bean 标签,第二个是使用注解的形式。这让对象创建的权限从程序员到Spring的权力的转移,我们是通过DI(依赖注入)来实现的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值