基于注解方式实现对象的创建
(1)注解是代码标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)
使用注解的目的:简化xml配置
Bean管理(创建对象)
@Component
@Service
@Controller
@Repository
导入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.9</version>
</dependency>
开启组件扫描
<?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: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/context/spring-context.xsd">
<!--开启组件扫描
1.如果要扫描多个包,使用逗号隔开
或者扫描包上层目录com.su
-->
<context:component-scan base-package="com.su.dao,com.su.service"></context:component-scan>
</beans>
service类
package com.su.service;
import org.springframework.stereotype.Service;
//value可以不写,默认值是类名称,首字母小写,默认userService
@Service(value = "userService") //等价<bean id="userService" class="">
public class UserService {
public void add(){
System.out.println("UserService add......");
}
}
测试
import com.su.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring5 {
@Test
public void TestService(){
ApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
}
组件扫描配置
<!--
use-default-filters="false" 表示现在不使用默认filter,自己配置filter
context:include-filter,设置扫描哪些内容
-->
<context:component-scan base-package="com.su" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--
context:exclude-filter:设置不扫描的内容
-->
<context:component-scan base-package="com.su">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
注入属性
@Autowired :根据属性类型进行自动装配
@Qualifier:根据属性名称注入
@Resource:根据类型注入,也可以根据名称注入
@Value:注入普通类型属性
属性类型
- 基本类型
- 对象
- 集合元素是基本类型
- 集合元素是对象
userDao接口
package com.su.dao;
public interface UserDao {
void add();
}
package com.su.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("UserDao add ....");
}
}
package com.su.service;
import com.su.dao.UserDao;
import org.junit.jupiter.api.parallel.ResourceLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
//value可以不写,默认值是类名称,首字母小写,默认userService
@Service(value = "userService") //等价<bean id="userService" class="">
/*
@Autowired :根据属性类型进行自动装配
@Qualifier:根据属性名称注入
@Resource:根据类型注入,也可以根据名称注入
@Value:注入普通类型属性
*/
public class UserService {
@Autowired
private UserDao userDao;
public void add(){
System.out.println("UserService add......");
userDao.add();
}
}
测试类
import com.su.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring5 {
@Test
public void TestService(){
ApplicationContext context =
new ClassPathXmlApplicationContext("bean.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
}
@Qualifier:根据属性名称注入
@Resource:根据类型注入,也可以根据名称注入
要先引入依赖
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
@value
完全注解开发
1.创建配置类,替代xml文件
package com.su.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //作为配置类,替代xml配置文件
@ComponentScan(basePackages = {"com.su"})
public class SpringConfig {
}
2.测试类中加载配置类
@Test
public void TestService2(){
//加载配置类
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService);
userService.show();
}
@Import注解
Springboot中通过@import注解导入Java类声明为bean的三种方式
User实体类
package com.su.entity;
import org.springframework.beans.factory.annotation.Value;
public class User {
@Value("楠晗")
private String name;
@Value("123456")
private String password;
public User() {
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void say(){
System.out.println("Hello,World");
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
SpringConfig配置类
package com.su.config;
import com.su.entity.User;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/*
Spring 3.0之前,我们的Bean可以通过xml配置文件与扫描特定包下面的类来将类注入到Spring IOC容器内。
Spring 3.0之后提供了JavaConfig的方式,也就是将IOC容器里Bean的元信息以java代码的方式进行描述。
我们可以通过@Configuration与@Bean这两个注解配合使用来将原来配置在xml文件里的bean通过java代码的方式进行描述。
@Import注解提供了@Bean注解的功能,同时还有xml配置文件里<import>标签组织多个分散的xml文件的功能,
当然在这里是组织多个分散的@Configuration。
*/
@Configuration
@Import(value = {com.su.entity.User.class})
public class SpringConfig {
}
TestSpring测试类
import com.su.config.SpringConfig;
import com.su.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestSpring {
@Test
public void testImport(){
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
User user = (User) context.getBean("com.su.entity.User");//一定要保证是全类名
user.say();
System.out.println(user);
}
}