Spring

Posted kuriyama-mirai

tags:

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

Spring框架:

   什么是Spring框架?

    1.Spring一个开源的,用来简化企业级应用开发的应用开发框架。Spring的核心就是IOC(控制反转)和AOP(面向切面编程);

    2.Spring框架可以理解为就是一个容器,用于管理对象的生命周期;

    3.Spring容器:spring框架中的一个核心模块,用来管理对象(包括对象的创建,销毁和初始化等)。它帮助完成类的初始化与装配工作,让开发者从这些底层类的实例化,依赖关系装配类的工作中脱离出来,专注于更有意义的业务逻辑开发工作;

    4.Spring是一个IOC(DI) 和 AOP 框架

        其中IOC(DI) 称为:控制反转 即把对象的获取方式进行了反转,例子(引用于百度)

        Class A 中用到了Class 的对象B,一般情况下,需要在A的代码中显示只能new 一个B对象,采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中

 本文聊聊:1.Spring依赖注入的方式

      2.依赖注入的类型

      3.Bean的作用域

         4.自动注入

      5.在Spring配置文件中引入属性文件

         6.使用注解的方式完成

      Spring的 jar 包

技术图片

 

(1)Spring依赖注入的方式

首先创建一个Hello类:一定要加上set方法,下图没有

技术图片

 技术图片

    1.通过set方法来完成依赖注入

      

<?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="Hello" class="com.zhiyou100.ydb.spring.Hello">
     <!--<property 就是通过set方法来注入Hello类的name属性的值 -->
    <property name="name" value="张三"></property>
    <property name="age" value="18"></property>
    </bean>
</beans>

  2.通过构造方法来完成依赖注入

<bean id="Hello2" class="com.zhiyou100.ydb.spring.Hello">
    <!-- 
            constructor-arg 构造方法的参数
            index:表示第几个参数 索引从0开始
            相当于 Hello h = new Hello("李四",18);
     -->
    <constructor-arg index="0" value="李四"></constructor-arg>
    <constructor-arg index="1" value="18"></constructor-arg>
</bean>

  测试:

package com.zhiyou100.ydb.test;

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

import com.zhiyou100.ydb.spring.Hello;

public class HelloTest 
    public static void main(String[] args) 
        ApplicationContext app = new ClassPathXmlApplicationContext("app.xml");
        Hello h = (Hello) app.getBean("Hello");
        h.Show();

运行结果:

技术图片

 

(2)依赖注入的数据类型

基本数据类型和字符串使用 value  如果是指向另一个对象的引用使用ref=

对象数据类型

列子:因为要用到另一个对象 (Student类)

package com.zhiyou100.ydb.spring;

public class Student 
    private String address;

    public String getAddress() 
        return address;
    

    public void setAddress(String address) 
        this.address = address;
    

    

在Hello类中加入Student 属性

 技术图片

<bean id="Hello" class="com.zhiyou100.ydb.spring.Hello">
     <!--<property 就是通过set方法来注入Hello类的name    属性的值 -->
    <property name="name" value="张三"></property>
    <property name="age" value="18"></property>
    <!-- ref指向另一个bean对象 -->
    <property name="student" ref="stu"></property>
</bean>
<bean id="stu" class="com.zhiyou100.ydb.spring.Student">
    <property name="address" value="南京"></property>
</bean>
</beans>

测试:

技术图片

 

 集合数据类型

在Hello类中加入list属性

技术图片

 

<bean id="Hello" class="com.zhiyou100.ydb.spring.Hello">
     <!--<property 就是通过set方法来注入Hello类的name    属性的值 -->
    <property name="name" value="张三"></property>
    <property name="age" value="18"></property>
    <!-- ref指向另一个bean对象 -->
    <property name="student" ref="stu"></property>
    <property name="list">
        <list>
            <value>刘能</value>
            <value>赵四</value>
            <value>广坤</value>
            <value>宋小宝</value>
        </list>    
    </property>
        </bean>
</beans>

测试

技术图片

 

Map数据类型

  在Hello类中加入Map类型

技术图片

<bean id="Hello" class="com.zhiyou100.ydb.spring.Hello">
     <!--<property 就是通过set方法来注入Hello类的name    属性的值 -->
    <property name="name" value="张三"></property>
    <property name="age" value="18"></property>
    <!-- ref指向另一个bean对象 -->
    <property name="student" ref="stu"></property>
    <property name="list">
        <list>
            <value>刘能</value>
            <value>赵四</value>
            <value>广坤</value>
            <value>宋小宝</value>
        </list>    
    </property>
    <property name="map">
        <map>
            <entry key="kobe" value="科比"/>
            <entry key="wade" value="韦德"/>
        </map>
    </property>
</bean>
</beans>

测试:

技术图片

 

 (3)Bean的作用域

  Bean 的作用域默认为单例模式

技术图片

 (4)自动注入

    自动注入该类中的属性

  首先需要创建一个类(UserDao)

技术图片

<bean id="udao" class="com.zhiyou100.ydb.spring.UserDao"></bean>
    <bean id="udao1" class="com.zhiyou100.ydb.spring.UserDao"></bean>
    <!--
        autowire:自动注入的属性
        byType:根据userDao属性的类型,找与之匹配的bean
        byName:根据属性名 找与之匹配的id
        no:需要自己手动注入
        default:采用全局的default-autowire设置
     -->
    <bean id="uservice" class="com.zhiyou100.ydb.spring.UserService" autowire="default">
        
    </bean>

注意:如果使用default 需要在头部加入 default-autowire

技术图片

 

 

(5)在spring配置文件中引入属性文件

首先创建外部的属性文件,放入到配置文件夹中

技术图片

 

 引入属性文件 使用  context:property-placeholder 标签

<!-- 引入外部属性文件 -->
    <context:property-placeholder location="classpath:my.properties"/>
    <bean id="user" class="com.zhiyou100.ydb.spring.User">
        <property name="name" value="$user.names"></property>
        <property name="age" value="$user.age"></property>
        <property name="sex" value="$user.sex"></property>
    </bean>
    

注意:如果引入多个文件可以使用通配符 * 也可以使用逗号分隔引入

(6)使用注解的方式

  首先不使用注解

上例子!

操作层:创建Dao包,里面创建好UserDaoImp 类 以及该类的接口 UserDao

UserDao 接口

package com.zhiyou100.ydb.dao;

public interface UserDao 

    void SelectById(int id);

UserDaoImp类 实现UserDao接口 

package com.zhiyou100.ydb.dao;

import org.springframework.stereotype.Repository;

public class UserDaoImp implements UserDao
    
    @Override
    public void SelectById(int id) 
        System.out.println("根据id查询信息");
    

业务层:创建service包,里面创建好UserServiceImp 类 以及该类接口 UserService

package com.zhiyou100.ydb.service;

public interface UserService 

    void QueryById(int id);

UserServiceImp类 实现UserService

package com.zhiyou100.ydb.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zhiyou100.ydb.dao.UserDao;
import com.zhiyou100.ydb.dao.UserDaoImp;

public class UserServiceImp implements UserService 
    private UserDao userdao;

    public void setUserdao(UserDao userdao) 
        this.userdao = userdao;
    
    
    @Override
    public void QueryById(int id) 
        userdao.SelectById(id);
    

控制层:创建controller包,里面创建好UserControler类

package com.zhiyou100.ydb.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.zhiyou100.ydb.service.UserService;

public class UserController 
    private UserService userService;
    
    public void setUserService(UserService userService) 
        this.userService = userService;
    

    public String findById(int id) 
        userService.QueryById(id);
        return "index";
    

在配置文件加入相应的类

<?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">
<!-- 管理UserDao的实现类 -->
<bean id="userDao" class="com.zhiyou100.ydb.dao.UserDaoImp"></bean>
<!-- 管理userService的实现类 -->
<bean id="userService" class="com.zhiyou100.ydb.service.UserServiceImp">
    <property name="userdao" ref="userDao"></property>
</bean>
<!-- 管理UserController的实现类 -->
<bean id="userController" class="com.zhiyou100.ydb.controller.UserController">
    <property name="userService" ref="userService"></property>
</bean>
</beans>

测试:

package com.zhiyou100.ydb.test;

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

import com.zhiyou100.ydb.controller.UserController;

public class UserConrollerTest 
    public static void main(String[] args) 
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserController uc = (UserController) app.getBean("userController");
        uc.findById(1);
    

结果成功输出 SelectById

技术图片

 

 

 而使用注解就是在各个类中加入

@Repository 持久化注解 用在Dao 类上

@Service 业务层注解

@ Autowired 自动注入 按照类型自动注入,如果有多个类型相同的那么就会按照名称注入

@Controller控制层注解

当然还要加入 aop的jar 包

技术图片

 

 然后在各类中加入注解

Dao类

package com.zhiyou100.ydb.dao;

import org.springframework.stereotype.Repository;

@Repository(value="userDao")
public class UserDaoImp implements UserDao
    
    @Override
    public void SelectById(int id) 
        System.out.println("根据id查询信息");
    

Service类

package com.zhiyou100.ydb.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zhiyou100.ydb.dao.UserDao;
import com.zhiyou100.ydb.dao.UserDaoImp;
@Service(value="userService")
public class UserServiceImp implements UserService 
    private UserDao userdao;
    @Autowired
    public void setUserdao(UserDao userdao) 
        this.userdao = userdao;
    
    
    @Override
    public void QueryById(int id) 
        userdao.SelectById(id);
    

Controller类

package com.zhiyou100.ydb.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.zhiyou100.ydb.service.UserService;
@Controller(value="userController")
public class UserController 
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService) 
        this.userService = userService;
    

    public String findById(int id) 
        userService.QueryById(id);
        return "index";
    

测试

package com.zhiyou100.ydb.test;

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

import com.zhiyou100.ydb.controller.UserController;

public class UserConrollerTest2 
    public static void main(String[] args) 
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext2.xml");
        UserController uc = (UserController) app.getBean("userController");
        uc.findById(1);
    

结果也可以正常打印SelectById 方法

注意:使用注解可以不加set方法哦 但是使用xml 方法必要要加set方法

上面使用的 @Autowired 注解是可以完成自动注入的功能,但是还有一个注解也可以完成此功能——@Resouce 自动注入按照名称注入,如果没有相同名称的bean那么会按照类型帮你注入。它可以指定名称来注入。

 

以上是关于Spring的主要内容,如果未能解决你的问题,请参考以下文章

Springspring事务失效的12种场景

SpringSpring MVCMyBatis

SpringSpring Data JPA

SpringSpring系列4之Spring支持JDBC

SpringSpring底层核心原理解析

SpringSpring 网络原因导致日志下载失败