java.Spring5

Posted Young_Leesin

tags:

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

IOC容器的原理

img

IOC容器的入门

环境准备

导入依赖

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

创建配置:applicationContext.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">
 
</beans>

创建容器

第一种形式:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

第二种形式:

ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:/applicationContext.xml");

IOC容器的Bean管理(XML方法)

配置Bean的三种形式

<bean class="com.caochenlei.spring5.bean.User"></bean>

<bean id="user" class="com.caochenlei.spring5.bean.User"></bean>

<bean name="user" class="com.caochenlei.spring5.bean.User"></bean>

Bean取别名的三种方式

<bean class="com.caochenlei.spring5.bean.User"></bean>
<alias name="com.caochenlei.spring5.bean.User" alias="systemUser"></alias>

<bean id="user" class="com.caochenlei.spring5.bean.User"></bean>
<alias name="user" alias="systemUser"></alias>

<bean name="user" class="com.caochenlei.spring5.bean.User"></bean>
<alias name="user" alias="systemUser"></alias>    

获取Bean的三种形式(实例化)

ApplicationContext applicationContext1 = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = applicationContext1.getBean(User.class);
System.out.println(user);

ApplicationContext applicationContext2 = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) applicationContext2.getBean("user");
System.out.println(user);


ApplicationContext applicationContext3 = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = applicationContext3.getBean("user", User.class);
System.out.println(user);

依赖注入

Bean的自动注入

Bean的实例化

Bean的前置实例化

Bean的延迟实例化

Bean的作用域

Bean的生命周期

IOC容器的Bean管理(注解方式)

半注解开发

image-20210520230540069

注解说明

注解 说明
@Component 使用在类上用于实例化Bean
@Controller 使用在web层类上用于实例化Bean
@Service 使用在service层类上用于实例化Bean
@Repository 使用在dao层类上用于实例化Bean
@Autowired 使用在字段上用于根据类型依赖注入
@Qualifier 结合@Autowried一起使用于根据名称进行依赖注入
@Resource 想当@Autowired + @Qualifier,按照名称进行注入
@Value 注入普通属性
@Scope 标注Bean的作用范围
@PostConstruct 使用在方法上标注该方法是Bean的初始化方法
@PreDestroy 使用在方法上标注该方法是Bean的销毁方法

POM 导入依赖

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

applicationContext 命名空间

xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

Bean的配置

开启扫描

    <!--    扫描所有组件-->
    <context:component-scan base-package="bean"/>

	<!--    被代替的xml管理方式,并且它可以扫描到bean下的所有类-->
    <bean id="user" class="bean.User"></bean>
    <!--    按组件配置扫描-->
    <context:component-scan base-package="bean" use-default-filters="true">
        <!--                只扫描《注解类型》,注解类型为:@Component-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>

        <!--                不扫描《注解类型》,注解类型为:@Repository、@Service、@Controller-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

声明一个组件

package com.ccl.bean;


import lombok.*;
import org.springframework.stereotype.Component;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor

//普通类实例化Bean的注解,空参可以
@Component("user")

//其他用途的注解也可以实例化普通类
//@Repository
//@Service
//@Controller
public class User {
    private Integer id;
    private String name;
    private String gender;

}

测试

@Test
public void test(){
    ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
    User user = app.getBean("user", User.class);
    System.out.println(user);
}

Bean的依赖注入

根据类型自动注入

import lombok.*;
import org.springframework.stereotype.Component;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor

//普通类实例化Bean的注解,空参可以
@Component()

public class User {
    private Integer id;
    private String name;
    private String gender;
}
import com.ccl.bean.User;
import org.springframework.stereotype.Repository;

//Dao层类实例化Bean的注解
@Repository
public class UserDao {
    public User findOne(Integer id){
        return new User(01,"leesin","man");
    }
}

第一种形式:将依赖注入私有属性中

import com.ccl.bean.User;
import com.ccl.dao.UserDao;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

//Service层类实例化Bean的注解
@Service
public class UserService {
    //相当于@Autowired + AQualifier,按照名称进行注入
    @Resource
    private UserDao userDao;

    public User userDao(Integer id) {
        return userDao.findOne(id);
    }
}

@Resource

​ @Resource注解与@Autowired注解一样,都可以用来自动装配bean。但我们要知道,@Autowired注解是属于Spring的,而@Resource注解是Java规范。@Resource注解也可以用在字段或者setter方法上。

  1. 写在字段上

    1. @Resource
      private UserDao userDao;
      
    2. @Resource(name = "userDao")
      private UserDao userDao;
      

      注意事项:当@Resource注解写在字段上时,默认先使用名称进行匹配,名称可以通过@Resource的name属性指定,如上。当没有指定name属性的时候,则默认取字段名作为名称查找。当按名称找不到的时候,则按照字段的类型进行匹配。最后若还是没有找到,则报异常

      nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException
      
  2. 写在setter方法上

    private UserDao userDao;
    
    @Resource
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    

第二种形式:将依赖注入到setter方法中

import com.ccl.bean.User;
import com.ccl.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


//Service层类实例化Bean的注解
@Service
public class UserService {
    private UserDao userDao;

    //相当于@Autowired + AQualifier,按照名称进行注入
    @Resource
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public User userDao(Integer id) {
        return userDao.findOne(id);
    }
}

第三种形式:将依赖注入到有参构造方法中

import com.ccl.bean.User;
import com.ccl.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

//Service层类实例化Bean的注解
@Service
public class UserService {
    private UserDao userDao;

    //@Resource  不适用于构造方法
    //    @Resource  
    
    //使用在字段上根据类型依赖注入
    @Autowired
    public UserService(UserDao userDao){
        this.userDao = userDao;
    }

    public User userDao(Integer id) {
        return userDao.findOne(id);
    }
}

测试

@Test
public void testAnnotation() {
    UserService userService = app.getBean("userService", UserService.class);
    User one = userService.userDao(01);
    System.out.println(one);
}

全注解开发

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

Java Spring5之IOC容器

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板