spring入门案例

前言

内容源自 it黑马

开发软件 :idea ,

项目构建:maven

jdk1.8

 

一、spring 基本开发步骤

 1、导包

  导入spring开发基本坐标

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

 

2、编写接口和实现类

接口:

public interface UserDao {
    public void save();
}

实现类:

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("save running ......");
    }
}

 

 

3、创建Spring核心配置文件

创建applicationContext.xml

 

 

 

 

4、在spring核心配置文件中配置bean

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>

 

5、使用获取bean对象

测试方法1:

 

public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao)app.getBean("userDao");
        userDao.save();
    }

 

 

测试方法2:

导入测试坐标

 

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>

在测试包下创建测试类:

包名与要测试的类相同,测试类名加Test

UserDaoTest

复制代码
public class UserDaoTest {
    @Test
    public void saveTest(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao)app.getBean("userDao");
        userDao.save();
    }

}
复制代码

 

 

 

 

二、bean标签的属性

 1 、基础属性

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>

  id : 在容器中唯一

  class : 类全路径

2、scope :对象作用范围

singleton :单例  默认 
prototype : 多例 
request :
session :
globalSession : 


3、bean的初始方法和销毁方法 标签属性

init-method :初始化方法 在创建对象时执行

destroy-method : 销毁方法 在对象销毁时执行

接口:

    public void init();
    public void destroy();

实现类:

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

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

spring容器文件:

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" init-method="init" destroy-method="destroy"></bean>

测试:

    @Test
    public void initAndDestroyTest(){
        //加载容器
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        app.destroy();//容器销毁方法
    }

结果:

 

 

3、spring bean 生命周期:

  bean 标签的scope属性:

  singleton :单例  默认 加载容器中时,创建对象,整个容器只创建一个对象,容器销毁时bean销毁
  prototype : 多例 加载容器时不创建对象,获取时创建对象,有java虚拟机的垃圾回收机制销毁

 1

 

 

三、spring bean 创建的三种方式

 

1、无参构造

  方法为无参构造

2、工厂静态方法

  创建工厂类

public class StaticFactory {
    public static UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

 

  配置文件

    <bean id="userDao" class="com.itheima.factory.StaticFactory" factory-method="getUserDao"></bean>

 

  测试

    @Test
    public void saveTest(){
        //加载容器
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao)app.getBean("userDao");
        userDao.save();
    }

 

3、工厂实例方法

  创建工厂类

1
2
3
4
5
public class DynamicFactory {
    public  UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

  

  配置文件

 

    <bean id="userDaoFactory" class="com.itheima.factory.DynamicFactory"></bean>
    <bean id="userDao" factory-bean="userDaoFactory" factory-method="getUserDao"></bean>

  

  测试:同上

 

 四、spring 依赖注入

spring 依赖注入的意思就是,对所有被spring管理的bean ,  例如 A ,B两个类,都被spring管理, B 中的一个属性类型为A ;此时如果B的构造方法参数类型为A ,或者有对应的set方法,那么spring就可以将 容器中的A对象注入到B中。

1、通过构造方法注入

  创建类

  dao复用上面的

  创建service

public interface UserService {
    public void save();
}

  创建实现类

复制代码
public class UserServiceImlp implements UserService {

    private UserDao userDao;

    public UserServiceImlp(UserDao userDao) {
        this.userDao = userDao;
    }
    public void save() {
        System.out.println("UserServiceImlp save running ......");
        userDao.save();
    }
}
复制代码

 

  配置文件:

    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
    <bean id="userService" class="com.itheima.service.impl.UserServiceImlp">
        <!-- name是构造方法的参数名称,ref关联bean的id-->
        <constructor-arg name="userDao1" ref="userDao"/>
    </bean>

 

 

  测试

    //测试通过构造方法注入属性值
    @Test
    public void testConstructor(){
        //加载容器
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService)app.getBean("userService");
        userService.save();
    }

  结果:

 

 

 

 

2、通过set方法注入

  service实现类代码:

  如果有带参构造方法时,需要添加无参构造,否则spring创建对象会报错。

    public UserServiceImlp() {
    }

 

   配置文件:

        <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
        <bean id="userService" class="com.itheima.service.impl.UserServiceImlp">
            <property name="userDao" ref="userDao"/>
        </bean>

    测试

 

 

 

spring注入常用属性:

  常用类型:int ,String , List , Map ,Properties

 

 创建类:

 

复制代码
package com.itheima.pojo;

import java.util.List;
import java.util.Map;
import java.util.Properties;

public class Student {
    private String name;
    private int age;
    private List list;
    private Map map;
    private Properties properties;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", list=" + list +
                ", map=" + map +
                ", properties=" + properties +
                '}';
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setList(List list) {
        this.list = list;
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }


}
复制代码

 

  配置文件:

复制代码
    <bean id="student" class="com.itheima.pojo.Student">
            <property name="name" value="张三"/>
            <property name="age" value="12"/>
            <property name="list">
                <list>
                    <value>aaa</value>
                    <value>bbb</value>
                    <value>ccc</value>
                </list>
            </property>
            <property name="map">
                <map>
                    <entry key="key1" value="123"/>
                    <entry key="key2" value="1234"/>
                    <entry key="key3" value="1235"/>
                </map>
            </property>
            <property name="properties">
                <props>
                    <prop key="p1">abc</prop>
                    <prop key="p2">zxcv</prop>
                    <prop key="p3">asdf</prop>
                </props>
            </property>
        </bean>
复制代码

 

  测试:

    @Test
    public void testConstructor(){
        //加载容器
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println(app.getBean("student"));
    }

  结果:

 

 

 拓展:

  引入配置文件:

  引入子模块的spring配置文件

  引入配置文件方便模块开发

        <import resource="applicationContext-student.xml"/>
        <import resource="applicationContext-factory.xml"/>

 

 

 

 引入properties文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!--约束中添加context命名空间-->
<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/beans/spring-context.xsd">
    <!--加载外部properties文件-->
    <context:property-placeholder location="jdbc.properties"/>

    <!--c3po 数据源-->
    <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--使用el表达式获取引入properties文件数据-->
        <property name="driverClass" value="${jdbc.driver}"/>
       <!-- <property name="driverClass" value="com.mysql.jdbc.Driver"/>-->
        <property name="jdbcUrl" value="jdbc:mysql://192.168.79.133:3306/test"/>
        <property name="user" value="root"/>
        <property name="password" value="root123"/>
    </bean>
</beans>
复制代码

 

 

 

 

 

 

 

 

 

 总结:

 

标签结构
bean
  property
    list
      value
    map
      entry
    props
    prop
import

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  测试

<bean>标签    id属性:在容器中Bean实例的唯一标识,不允许重复    class属性:要实例化的Bean的全限定名    scope属性:Bean的作用范围,常用是Singleton(默认)和prototype    <property>标签:属性注入        name属性:属性名称        value属性:注入的普通属性值        ref属性:注入的对象引用值        <list>标签        <map>标签        <properties>标签    <constructor-arg>标签<import>标签:导入其他的Spring的分文件
 
posted @   hehehenhen  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示