@Component注解
之前是使用bean标签在XML核心配置文件里面注册Bean的,我们可以使用@Component注解来代替它,只需要在需要交给Spring类上加上@Component注解即可。但首先需要在配置文件里面配置扫描哪些包下面的该注解:
<?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 https://www.springframework.org/schema/context/spring-context.xsd"><!--设置支持注解--><context:annotation-config/><!--设置扫描的包--><context:component-scan base-package="com.wjh"/></beans>
package com.wjh.po;
import org.springframework.stereotype.Component;
/**
* @author wjh
* @date 2021/7/17 10:57
* @Package com.wjh.po
*/
@Component
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
public class User {
private String name;
private Integer age;
private String sex;
setXxx..
getXxx..
}
使用@Component注解注册的Bean,其默认的id是小写字母开头的类名,如“User”默认的id是“user”,如果不想使用默认的id,可以自己在注解中设置,如:“@Component(“myUser”)”。
import com.wjh.po.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author wjh
* @date 2021/7/17 11:01
* @Package PACKAGE_NAME
*/
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//采用new ClassPathXmlApplicationContext("ApplicationContext.xml")
User user= (User) context.getBean("user");
System.out.println(user);
}
}
@Component的衍生注解
由@Component衍生出来的注解有:@Controller、@Service、@Repository,这三个注解的作用其实和@Component的作用是一样的,都是把Bean注册在Spring中,由于Java应用开发一般具有明确的层次,所以@Controller用于controller层,@Service用于service层,@Repository用于dao层。举一个例子:
package com.wjh.dao;
import org.springframework.stereotype.Controller;
/**
* @author wjh
* @date 2021/7/17 11:26
* @Package com.wjh.dao
*/
@Controller
public class UserDao {
}
@value注解
@value注解可以为Bean注入普通属性
@Value("阿离")
private String name;
@Value("20")
private Integer age;
@Value("女")
private String sex;
但是如果属性是一个对象,那么就无法使用@value注解了,这时候可以使用@Autowired注解来自动装配,当然自动装配的对象需要存在ioc容器中。如果类中还提供了set方法,@value注解还可以标注在set方法上,这和标注在属性上是一样的,而且优先级更加高,如:
@Value("阿离")
public void setName(String name) {
this.name = name;
}
@scope注解
@scope用的不多,了解即可,它一般有两个可以设置的值:singleton和prototype
singleton:默认的,Spring会采用单例模式创建这个对象,关闭工厂 ,所有的对象都会销毁。
prototype:多例模式,关闭工厂 ,所有的对象不会销毁,内部的垃圾回收机制会回收。
@Controller("user")
@Scope("prototype")
public class User {
@Value("阿离")
public String name;
}
XML与注解的对比
XML与注解比较
XML可以适用任何场景 ,结构清晰,维护方便
注解不是自己提供的类使用不了,开发简单方便
xml与注解整合开发
xml管理Bean
注解完成属性注入
使用过程中, 可以不用扫描,扫描是为了类上的注解
基于Java类进行配置(使用纯注解)
JavaConfifig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本,JavaConfifig 已正式成为 Spring4 的核心功能 ,它可以不再需要xml配置文件,可以完全使用注解。先介绍几个常用的配置注解:
@Configuration注解
使用@Configuration注解标注的类表示这个类是一个配置类,相当于核心配置文件
package com.wjh;
import org.springframework.context.annotation.Configuration;
/**
* @author wjh
* @date 2021/7/17 11:32
* @Package com.wjh
*/
@Configuration
public class MyConfig {
}
@Bean 注解
@Bean注解可以在配置类中注册一个Bean
@Configuration
public class MyConfig {
@Bean
public User user(){
return new User();
}
}
其中,方法名就是Bean的id,返回值就是Bean的类型,而获取Bean的类需要发生改变,如:
import com.wjh.MyConfig;
import com.wjh.po.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author wjh
* @date 2021/7/17 11:01
* @Package PACKAGE_NAME
*/
public class Test {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
//要求使用AnnotationConfigApplicationContext
User user= (User) context.getBean("user");
System.out.println(user);
}
}
关于这种Java类的配置方式,我们在之后的SpringBoot 和 SpringCloud中还会大量看到,现在只需要知道这些注解的作用即可。
