[自主学习一:Spring]day01_MySpring_CoreSpring

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[自主学习一:Spring]day01_MySpring_CoreSpring相关的知识,希望对你有一定的参考价值。

 

1、根据jar包需要,导入spring核心jar包。

 

技术分享

 

2、编写spring的context上下文环境

<?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 definitions here -->

</beans>

 

3、编写java类

3.1、编写POJO类

package com.corespring.core;

public class UserInfo {
    private String userName;
    private String userPass;
    private String empno;
    
    public UserInfo(){
        System.out.println("调用空参构造函数");
    }
    
    public UserInfo(String userName) {
        super();
        this.userName = userName;
    }
    
    public UserInfo(String userName, String userPass) {
        super();
        this.userName = userName;
        this.userPass = userPass;
        System.out.println("调用-2-个参数的构造函数");
    }
    
    public UserInfo(String userName, String userPass, String empno) {
        super();
        this.userName = userName;
        this.userPass = userPass;
        this.empno = empno;
        System.out.println("调用--3--个参数的构造函数");
    }
    
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPass() {
        return userPass;
    }
    public void setUserPass(String userPass) {
        this.userPass = userPass;
    }
    
    public String getEmpno() {
        return empno;
    }

    public void setEmpno(String empno) {
        this.empno = empno;
    }
}

3.2、编写service层:

接口:

package com.corespring.core.biz;

import java.util.List;

import com.corespring.core.UserInfo;

public interface IUserBiz {
    public abstract List<UserInfo> findList();//接口里面的方法都是抽象方法,但修饰符public abstract是默认的,所以也可以省略不写
}

该接口的实现类:

package com.corespring.core.biz.impl;

import java.util.List;

import com.corespring.core.UserInfo;
import com.corespring.core.biz.IUserBiz;
import com.corespring.core.dao.IUserDao;

public class UserBizImpl implements IUserBiz{
    public UserBizImpl(){
        System.out.println("调用UserBizImpl---空参--构造函数..........");
    }
    
    private IUserDao userDao;
    public UserBizImpl(IUserDao userDao) {
        super();
        this.userDao = userDao;
        System.out.println("调用UserBizImpl--一个参数--构造函数");
    }

    @Override
    public List<UserInfo> findList() {
        return userDao.findAll();
    }
     
}

3.3、编写dao层:

接口:

package com.corespring.core.dao;

import java.util.List;

import com.corespring.core.UserInfo;

public interface IUserDao {
     public abstract List<UserInfo> findAll();//接口方法前面的修饰符默认为:public abstract,所以不写这两个单词也行
}

该接口的实现类:

package com.corespring.core.dao.impl;

import java.util.ArrayList;
import java.util.List;

import com.corespring.core.UserInfo;
import com.corespring.core.dao.IUserDao;

public class UserDaoImpl implements IUserDao{

    public UserDaoImpl(){
        System.out.println("UserDaoImpl构造函数");
    }
    
    @Override
    public List<UserInfo> findAll() {
        List<UserInfo> list=new ArrayList<UserInfo>();
        UserInfo  userInfo=null;
        for(int i=0;i<10;i++)
        {
            userInfo=new UserInfo("user"+i,"pass"+i);
            list.add(userInfo);
        }
        return list;
    }
  
}

 

4、配置spring上下文环境:

<?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 definitions here -->

<!--biz层(服务层)  -->
<bean id="UserBizImpl" class="com.corespring.core.biz.impl.UserBizImpl">
 <!--进行依赖注入时,可以使用value或ref进行注入;ref配置的是其他bean的id值 (即其他由spring管理的类),可以理解为一个引用,就是引用其他bean的id -->
 <!--当使用ref进行依赖注入时,会先实例化引用对象后,才实例化本类  -->
 <!--因为我们在biz层添加了一个构造函数,用于传递dao层的接口对象,所以,我们要在这里使用构造函数依赖注入的方式,将dao层接口对象传过去  -->
  <constructor-arg name="userDao" ref="UserDaoImpl"></constructor-arg>
</bean>
<!--dao层  -->
<bean id="UserDaoImpl" class="com.corespring.core.dao.impl.UserDaoImpl">
</bean>

<!--配置一个 bean  用于初始化javabean的值,初始化的过程,称为依赖注入(采用的是,使用构造函数初始化值),如果没有进行值注入,则没有进行初始化,注入值的方法一:<constructor-arg value="nihao"></constructor-arg>    -->
<!--id值 可以任意命名,但不能重名;这个   class 是  想要初始化那个类的引用-->
<bean id="UserInfo" class="com.corespring.core.UserInfo">
    <!--constructor-arg value="abc" 为构造函数初始化默认值 ,它的属性  name 表示指定为某个属性初始化值 -->
    <!--使用构造函数进行依注入:
      1、能够跟根据构造参数的个数自动匹配类的构造函数。
      2、可以不指定参数的名称,此时,会根据类的参数列表顺序进行注入
      3、可以全部或部分指定参数名称(使用name属性),此时会跟根据参数名称进行注入
      4、如果使用了参数名称 ( name属性),则参数的配置顺序可以任意颠倒,也就是说,如果没有指定参数名称,则这里的配置顺序,将会对应构造函数那边的书写顺序
      5、配置的参数个数一定要与构造函数匹配
      6、如果在这里配置了初始值,而该初始值没有相应的构造函数,那么是不能实例化成功的,运行时,会出错
      7、这个  bean 可以多次配置,只要id不重复,就可以了
    -->
    <constructor-arg name="empno" value="abc"></constructor-arg> 
    <constructor-arg  value="123456"></constructor-arg> 
    <constructor-arg value="nihao"></constructor-arg>    
</bean>


<!--依赖注入方法二 ,因为这个并没有构造函数的值,所以在实例化这个类的时候,它会调用空参的构造函数,(一个类,实例化的时候,构造函数一定会被执行) -->
<bean id="UserInfo1" class="com.corespring.core.UserInfo">
<!--在使用spring管理对象时,还可以使用set方法进行依赖注入  -->
<!--使用property配置依赖关系时,name属性是必须要配置的  -->
<property name="UserName" value="敏"></property>
<!--在配置property的name时,配置的是set方法后面的名称,而不是类的属性名称  -->
<property name="empno" value="1001"></property>
</bean>
</beans>

 

5、编写测试类

package test;

import java.util.List;

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

import com.corespring.core.UserInfo;
import com.corespring.core.biz.impl.UserBizImpl;

public class TestUserBiz {
     
    public static void main(String[] args) {
        //1.初始化spring上下文环境
        String config="applicationcontext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        //2、通过spring上下文环境,调用spring的bean factory实例化对象
        /*其实这里可以直接转成父接口,如:IUserBiz userBiz = (IUserBiz) ctx.getBean("UserBizImpl");
             它能直接转成父接口,这就是接口隔离原则(接口的调用类不关心接口的实现类而只关心接口方法)
        */
        UserBizImpl userBizimpl=(UserBizImpl) ctx.getBean("UserBizImpl");
        System.out.println("调用findlist方法前..........");
        //3.调用实例对象,实现业务功能
        List<UserInfo> list=userBizimpl.findList();
        for (UserInfo userInfo : list) {
            System.out.println(userInfo.getUserName()+"----"+userInfo.getUserPass());
        }
    }
}

注意看看下面这个类:

package test;

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

import com.corespring.core.UserInfo;

public class TestUserInfo {
    //ApplicationContext  ctx;      /*如果测试方法 testSpring2() 时,把这个环境定义为全局*/
    //传统的方法
    private static void test(){
        UserInfo userInfo=new UserInfo();
        System.out.println(userInfo.getUserPass());
    }
    
    
    public static void main(String[] args) {
         // test();
        testSpring();
//        testSpring2();//如果把这个方法放到方法testSpring(); 的前面 ,是不行的,运行出错,因为没有初始化上下文环境
    }
   
    //使用Spring方法
    private static void testSpring(){
        UserInfo userInfo=null;
        
        System.out.println("-----1-----");//打印这些数字,只是为了查看spring的生命周期
        
        //1。初始化spring上下文环境;因为它要预先取读取有多少个需要实例化的变量。在初始化上下文环境的时候,
        //applicationcontext.xml 里面的内容都会被执行
          String config="applicationcontext.xml";
          ApplicationContext  ctx=new ClassPathXmlApplicationContext(config);
          
          System.out.println("------2------");
          
        //2.通过spring上下文环境,调用spring的bean factory 实例化对象
          userInfo=(UserInfo)ctx.getBean("UserInfo1");//UserInfo 这个是applicationcontext.xml bean 的id.
        //3.调用实例化后的对象,实现业务功能
          System.out.println("-----3----");
          System.out.println(userInfo.getUserName());
          System.out.println(userInfo.getUserPass());
          System.out.println(userInfo.getEmpno());
          
    }
    
//    private static void testSpring2(){
//        UserInfo userInfo=null;  
//          userInfo=(UserInfo)ctx.getBean("UserInfo1");//UserInfo 这个是applicationcontext.xml bean 的id.
//          System.out.println("-----3----");
//          System.out.println(userInfo.getUserName());
//          System.out.println(userInfo.getUserPass());
//          System.out.println(userInfo.getEmpno());
//          
//    }
    
    
}

 

好了,到此简单的spring学习完毕,下面附上开发步骤:

Spring开发步骤:

1、新建Java项目
2、把spring的lib库的核心jar包加入到项目的libs中:
  spring-beans-4.1.7.RELEASE.jar  
  spring-context-4.1.7.RELEASE.jar
  spring-core-4.1.7.RELEASE.jar
  spring-expression-4.1.7.RELEASE.jar
 
     而且还要添加日志文件:commons-logging-1.1.3.jar;
     这个日志文件在:文件夹ssh\\spring-framework-4.0.0-dependencies\\files-2.1\\commons-logging\\commons-logging\\1.1.3\\f6f66e966c70a83ffbdb6f17a0919eaf7c8aca7f
  

3、添加spring的context上下文环境
       即是写: applicationcontext.xml文件;这个文件的内容在第七章,标题为:34.2 XML Schema-based configuration 
       
  <?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 definitions here -->

  </beans>
       
       
4、编写java类,并交给spring进行管理
<?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 definitions here -->
<bean id="UserInfo" class="com.corespring.core.UserInfo">
</beans>

5、编写测试类,通过spring bean factory 进行实例化
   private static void testSpring(){
        UserInfo userInfo=null;
        //1。初始化spring上下文环境;因为它要预先取读取有多少个需要实例化的变量
          String config="applicationcontext.xml";
          ApplicationContext  ctx=new ClassPathXmlApplicationContext(config);
          
        //2.通过spring上下文环境,调用spring的bean factory 实例化对象
          userInfo=(UserInfo)ctx.getBean("UserInfo");//UserInfo 这个是applicationcontext.xml bean 的id.
        //3.调用实例化后的对象,实现业务功能
          System.out.println(userInfo.getUserPass());
   }


------------------------------
理解spring的生命周期:
1、spring的使用过程有3个步骤
   (1)。初始化spring上下文环境
   (2)。通过spring上下文环境,调用spring的bean factory实例化对象;
   (3).调用实例化后的对象,实现业务功能

2、当初始化spring环境时,会对配置到spring配置文件中的类进行实例化;
3、当通过bean factory取得实例化对象时,其实是返回实例对象的引用
4、当ApplicationContext对象引用失效时,spring的环境同时失效



------------------------------------------------------------------------------------------------------------------
1、配置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"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- bean definitions here -->

  </beans>
 

Spring开发使用三层架构:

1、采用面向接口编程思想

2、编写各层次代码:三层结构(视图层、业务层、数据访问层)
      这里的项目使用两个接口、两个接口的实现类
      
3、把接口实现类交给spring进行管理
   <!--biz层  -->
   <bean id="UserBizImpl" class="com.corespring.core.biz.impl.UserBizImpl">
   <!--进行依赖注入时,可以使用value或ref进行注入;ref配置的是其他bean的id值 (即其他由spring管理的类),可以理解为一个引用,就是引用其他bean的id -->
   <!--当使用ref进行依赖注入时,会先实例化引用对象后,才实例化本类  -->
    <!--因为我们在biz层添加了一个构造函数,用于传递dao层的接口对象,所以,我们要在这里使用构造函数依赖注入的方式,将dao层接口对象传过去  -->
   <constructor-arg name="userDao" ref="UserDaoImpl"></constructor-arg>
   </bean>
   <!--dao层  -->
   <bean id="UserDaoImpl" class="com.corespring.core.dao.impl.UserDaoImpl">
   </bean> 
   
4、编写测试类(视图层),使用spring框架功能
      public static void main(String[] args) {
        //1.初始化spring上下文环境
        String config="applicationcontext.xml";
        ApplicationContext ctx=new ClassPathXmlApplicationContext(config);
        //2、通过spring上下文环境,调用spring的bean factory实例化对象
        /*其实这里可以直接转成父接口,如:IUserBiz userBiz = (IUserBiz) ctx.getBean("UserBizImpl");
             它能直接转成父接口,这就是接口隔离原则(接口的调用类不关心接口的实现类而只关心接口方法)
        */
        UserBizImpl userBizimpl=(UserBizImpl) ctx.getBean("UserBizImpl");
        System.out.println("调用findlist方法前..........");
        //3.调用实例对象,实现业务功能
        List<UserInfo> list=userBizimpl.findList();
        for (UserInfo userInfo : list) {
            System.out.println(userInfo.getUserName()+"----"+userInfo.getUserPass());
        }
    }   

 

附上项目结构图:

技术分享

 

以上是关于[自主学习一:Spring]day01_MySpring_CoreSpring的主要内容,如果未能解决你的问题,请参考以下文章

Spring学习-day01

spring boot 文档学习笔记day01

Spring Boot学习Day01

day04_MySQL学习笔记01

Spring框架学习Day01

redis学习——day01_redis简介与安装