6.1 概览
6.1.1 简介
Spring4之后,要使用注解开发,则必须导入aop的jar包。值得一提的是,注解开发只用用于一些简单的开发,一旦涉及复杂操作,还是需要使用配置文件,例如一个实体类中,有其他实体类作为属性。
6.1.2 配置文件
<?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
https://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.yun"/>
</beans>
提示: 这个地法的支持标签——scan 下的package必须指定你的所有注解类所在的包,否则注解不能生效。
6.2 bean、属性与作用域
User.java:
package com.yun.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("singleton")
public class User {
@Value("李四哥")
private String name;
@Value("45")
private int age;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试接口:
package com.yun;
import com.yun.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void UserTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = context.getBean("user", User.class);
System.out.println(user);
}
}
输出结果:
User{name='李四哥', age=45}
提示: @Component 注解的作用是将该实体类注册到容器中,也就是相当于 bean标签 的作用。@Value() 注解的作用是为为属性进行 值注入 。@Scop 注解的作用是为该实体类注册的bean指定作用域,备选值依旧是 singeleton、prototype、request、session、application、websocket 这些。
6.3 注解衍生
6.3.1 简介
6.2的内容都是在pojo层,而按照MVC三层架构来说,还应该有dao、service、controle等内容,而所谓的衍生注解,则是针对这三层的。
6.3.2 例子
dao层:
package com.yun.dao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
@Override
public String toString(){
return "这是UserDao类";
}
}
Service层:
package com.yun.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Override
public String toString(){
return "这是UserService类";
}
}
Controller层:
package com.yun.control;
import org.springframework.stereotype.Controller;
@Controller
public class loginServlet {
@Override
public String toString(){
return "这是loginServlet类";
}
}
测试接口:
package com.yun;
import com.yun.control.loginServlet;
import com.yun.dao.UserDao;
import com.yun.pojo.User;
import com.yun.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void UserTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = context.getBean("userDao", UserDao.class);
loginServlet loginServlet = context.getBean("loginServlet", loginServlet.class);
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userDao);
System.out.println(loginServlet);
System.out.println(userService);
}
}
提示: 值得一提的是,使用注解进行开发,在调用容器中的bean时,名字必须使用 类名首字母小写 的形式,否则便会报错。例如:UserDao,getBean(“userDao”,UserDao.class)。
结果:
这是UserDao类
这是loginServlet类
这是UserService类
写在最后,使用注解仅适用于简单的案例,复杂案例还是需要配置文件,而大家在开发中,往往使用的是,在配置文件中进行bean配置,使用注解负责属性注入。
6.4 使用Java代替xml配置文件
6.4.1 简介
Spring的配置文件,除了可以使用 applicationContext.xml 来实现,还可以通过 Java配置类 实现。
6.4.2 使用
ApplicationConfig.java:
package com.yun.config;
import com.yun.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public User getUser(){
return new User();
}
}
提示: 此处的 @Configuration 注解跟 @Component 注解一样,都是一种标试,只是它的作用是,告诉Spring我是你的配置文件。
User.java:
package com.yun.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class User {
@Value("王二嫂")
private String name;
@Value("2022568435")
private int ID;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", ID=" + ID +
'}';
}
}
测试接口:
package com.yun;
import com.yun.config.ApplicationConfig;
import com.yun.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
@Test
public void test(){
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
User user = context.getBean("getUser", User.class);
System.out.println(user);
}
}
提示: 此处的getBean的参数值,是java配置文件中的方法名。并且,由于使用的配置方法已经有所不同,因此在容器的获取上面,也有着差异,例如实例化的对象已经有所改变。
测试结果:
User{name='王二嫂', ID=2022568435}
总结: Java配置Spring,与Xml配置Spring的作用是一样的,因此,xml能够实现的内容,java配置文件依旧可以实现,例如多个配置文件之间的插入 @import注解,又或者说扫描注解等。但是具体的使用,则需要在SpringBoot了解。