Spring基础:一

1 Spring是什么?

1_Spring是分层的JAVA SE/EE应用, full-stack轻量级全栈式开源框架.

两个内核:

  反转控制:  loC(Inverse Of Control), 把对象的创建交给框架.

  面向切面编程:  AOP(Aspect Oriented Programming), 对动态代理再次封装

2_好处:

  1.方便解耦,简化开发,

    将对象的创建交给Spring完成;  将对象之间的依赖关系交给Spring控制.  借助loC降低程序之间的耦合,目的是去掉new对象的过程.   

  2.AOP编程的支持

    借助AOP来实现方法的动态增强

  3.支持声明式事物

    业务层控制事物, 之前是编程式事物, spring只需要配置就可以

  4.方便集成其他框架,比如structs, hibernate, mybatis等

3_体系结构

  

2 Spring程序的开发步骤

  1_导入spring开发的基本包坐标

<!--导入Spring依赖-->
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
 </dependencies>

  2_编写Dao接口和实现类

//编写接口
package com.ppvir.dao;
public interface IUserDao {
    void save();
}

//编写实现接口的实体类
package com.ppvir.dao.Impl;

import com.ppvir.dao.IUserDao;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserDaoImpl implements IUserDao{

    public void save() {
        System.out.println("save running....");
    }

} 

  3_在resources目录下创建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"
              xmlns:p="http://www.springframework.org/schema/p" 
              xmlns:util="http://www.springframework.org/schema/util"
              xsi:schemaLocation="http://www.springframework.org/schema/beans 
              http://www.springframework.org/schema/beans/spring-beans.xsd 
              http://www.springframework.org/schema/util 
              http://www.springframework.org/schema/util/spring-util.xsd"><bean id="userDao1" class="com.ppvir.dao.Impl.UserDaoImpl" scope="prototype" ></bean></beans>

  4_在spring配置文件中配置UserDaoImpl

<bean id="userDao1" class="com.ppvir.dao.Impl.UserDaoImpl" scope="prototype" ></bean>

  5_使用Spring的api获得Bean实例

//测试
public static void main(String[] args) {
    //使用ClassPathXmlApplicationContext从类的根据经下加载配置文件 (target/classes)
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
   //根据Bean的id从容器中获得bean实例, 返回的是object类型, 需要强转
     IUserDao userDao = (IUserDao) context.getBean("userDao");
     userDao.save();
  }

3 Spring 配置文件

 1_bean标签

  • 功能
    •   用于配置对象交由Spring创建
  • 注意事项
    •   默认情况下调用类中的无参构造方法, 如果没有无参构造则不能创建成功
    •         id值是唯一标识,  不能重复
  • 基本属性
    • ID  Bean实例在Spring容器中的唯一标识 
    • class     Bean的全类名
    • scope 对象的作用取值范围   
      • singleton:  单例--表示每次调用getBean("")方法,获取到的都是同一个对象
      • prototype:  多例--表示每次调用getBean("")方法取到的值都是一个新对象,每次获取到的都不一样
    • bean对象的创建相关属性 
      • 方式一: 无参构造方法实例化
      • <bean id="userDao" class="com.ppvir.dao.impl.UserDaoImpl"/>
        相当于  UserDao userDao = new UserDaoImpl();
      • 方式二: 工厂静态方法实例化 
      • //第一步 创建静态工厂
        public class StaticFactory{
            public static UserDao getUserDao(){
                 return new UserDaoImpl();   
            }  
        } 
        
        //第二步  配置class属性指定工厂类, factory-method指定工厂方法
        <bean id="userDao" class="com.ppvir.factory.StaticFactory" factory/>
           

         相当于 UserDao userDao = StaticFactoty().getUserDao();

      • 方式三: 工厂实例方法实例化 
      • //第一步  创建工厂类
        
        public class  DynamicFactory{
            public UserDao getUserDao(){
                return new UserDaoImpl();
            }  
        }
        
        //第二步  先将工厂类通过bean对象配置到xml中
        <bean id="factory" class ="com.ppvir.factory.DynamicFactory"/>
        
        //第三步  配置userDao, 通过factory-method指定具体工厂,通过factory-method指定具体工厂的方法
        <bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>

         相当于UserDao userDao = new DynamicFactory().getUserDao();

  • 依赖注入(DI)的三种数据类型

   bean依赖注入:    通过框架为bean中的属性赋值,   它是spring框架核心loC的具体体现,在编写程序时,通过loC控制反转,将对象的创建交给Spring

,但是代码中不可能出现没有依赖的情况.  loC解耦值是降低他们的依赖关系,但是不会消除.   

    1_引用数据类型  把其他bean注入给当前bean的属性的两种方式

    Bean依赖注入的方式:

    • set方法依赖注入:
      • 会调用userDao属性对应的setUserDao方法将id="userDao"的bean注入给userDao属性
      • <!--UserService service= new UserService()-->
        <bean id="userService" class="com.ppvir.service.UserService">
            <!--    service.setUserDao(userDao)    -->
            <property name="userDao" ref="userDao"/>
        </bean>
    • p命名空间依赖注入:
      • 本质上也是set方法注入,凡是比set方法更加方便,主要体现在配置文件中
      1. 引入p命名空间
      • 1 <!--p 命名空间-->
        2 
        3 xmlns:p="http://www.springframework.org/schema/p"

        2. 修改注入方式  

            <bean id="userService"  class="com.itheima.service.impl.UserServiceImpl" p:userDao-ref="userDao"></bean>

    • 使用构造方法依赖注入 
      • <!--XML代码部分-->
        
        <bean id = "userService" class= "com.ppvir.service.impl.UserServiceImpl">
            <constructor-arg name="userDao" ref="userDao"/>
            <!-- name值userDao是属性名    ref值userDao是beanID-->
        </bean>
        //java代码部分
        public UserServiceImpl(UserDao userDao){
            this.userDao = userDao;    
        }

    2_普通数据类型

    •  1 //1_配置文件部分,添加属性使用property标签, name=""  value=""
       2 //name中的值时setAge,setCompany
       3 
       4 <bean id="userDao" class="com.ppvir.dao.impl.UserDaoImpl">
       5     <property name="company" value="xxx有限公司"></property>
       6     <property name="age" value="20"></property>
       7 </bean>
       8 
       9 
      10 //2_java代码部分
      11 
      12 public class UserDaoImpl implements UserDao {
      13     private String company;//私有化成员变量
      14     private int age;
      15     /* 依赖注入的两种方式:  构造方法,set方法 */
      16     public void setCompany(String company) {
      17         this.company = company;
      18     }
      19     public void setAge(int age) {
      20         this.age = age;
      21     }
      22     public void save() {
      23         System.out.println(company+"==="+age);
      24         System.out.println("UserDao save method running....");   
      25     }
      26 }       

    3_集合数据类型(List<String>的注入)

    •  1 /*
       2 配置文件部分
        数组和set集合的注入方式与list类似
      3 */ 4 5 <bean id="userDao" class="com.ppvir.dao.impl.UserDaoImpl"> 6 <property name="strList"> 7 <list> <!--list集合注入,直接在list标签中添加value--> 8 <value>集合1</value> 9 <value>集合2</value> 10 <value>集合3</value> 11 </list> 12 </property> 13 </bean> 14 15 /* 16 java代码部分 17 */ 18 19 public class UserDaoImpl implements UserDao { 20 private List<String> strList; 21 public void setStrList(List<String> strList) { 22 this.strList = strList; 23 } 24 public void save() { 25 System.out.println(strList); 26 System.out.println("UserDao save method running...."); 27 } 28 }

   <property>标签中,容易混淆的两个属性名  value, ref都是给属性设置值的,

    value是为普通类型设置值

    ref是把当前容器中的其他bean赋值给属性

 2_import标签

  • 功能:  引入其他xml配置文件
  • 注意;  该标签和bean是兄弟关系, 不是嵌套关系
  • <import resource="applicationContext-user.xml"/>
    
    <import resource="applicationContext-product"/>

 

猜你喜欢

转载自www.cnblogs.com/ppvir/p/11369952.html