java.Spring5
Posted Young_Leesin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.Spring5相关的知识,希望对你有一定的参考价值。
IOC容器的原理
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管理(注解方式)
半注解开发
注解说明
注解 | 说明 |
---|---|
@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方法上。
-
写在字段上
-
@Resource private UserDao userDao;
-
@Resource(name = "userDao") private UserDao userDao;
注意事项:当@Resource注解写在字段上时,默认先使用名称进行匹配,名称可以通过@Resource的name属性指定,如上。当没有指定name属性的时候,则默认取字段名作为名称查找。当按名称找不到的时候,则按照字段的类型进行匹配。最后若还是没有找到,则报异常
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException
-
-
写在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的主要内容,如果未能解决你的问题,请参考以下文章