使用注解开发-Spring
一. 使用xml文件
1.1 引入spring-aop包:
在Spring4之后, 想要使用注解开发, 需要引入aop包
一般推荐直接导入spring-webmvc,这个包中包含了大部分spring所需要的包:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.12</version>
</dependency>
1.2 配置文件annotationContext.xml
除了最基本的约束以外, 还需要加入context的约束:
<?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">
</beans>
1.3 Bean的实现,属性注入,自动装配,设置作用域
在配置文件中开启指定注解扫描的包:
<!-- 扫描com.ctgu包下的所有的注解-->
<context:component-scan base-package="com.ctgu"/>
在开启扫描的包下的User类中增加注解:@Component
@Data
//lombok
@Component(value = "user666")
//相当于在配置文件中添加了一句: <bean id="user666" class="com.ctgu.pojo.User">...</bean>
@Scope("singleton")
//设置作用域
public class User {
@Value("翁博梁")
//相当于添加属性: <property name="name" value="翁博梁"/>
private String name;
private Dog dog;
@Autowired
//相当于添加属性: <property name="dog" ref="dog"/>
public void setDog(Dog dog) {
this.dog = dog;
}
}
Dog类
@Data
@Component
public class Dog {
@Value("豆豆")
private String name;
}
1.4 一些注解的衍生注解
@Component的三个衍生注解
- @Controller - controller层
- @Service - service层
- @Respository - dao层
功能大体相同, 一般作用于不同的层
UserService类
@Data
@Service
public class UserService {
@Value("userService")
private String name;
}
1.5 测试
测试类
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("annotationContext.xml");
System.out.println(context.getBean("user666"));
System.out.println(context.getBean("dog"));
System.out.println(context.getBean("userDao"));
System.out.println(context.getBean("userService"));
System.out.println(context.getBean("userController"));
}
测试结果
User(name=翁博梁, dog=Dog(name=豆豆))
Dog(name=豆豆)
UserDao(name=userDao)
UserService(name=userService)
UserController(name=userController)
二. JavaConfig(不使用xml文件)
使用@Bean
注释来配置Bean的定义, @Bean
就相当于<bean/>
元素。
用@Configuration
注解一个类表明它主要作为 bean 定义的来源。此外,@Configuration
类允许通过调用@Bean同一类中的其他方法来定义 bean 间的依赖关系。最简单的@Configuration
类如下:
2.1 定义配置类
SpringConfig类
@ComponentScan("com.ctgu")//扫描该包下使用@Component注解定义的bean
@Configuration
public class SpringConfig {
@Bean//通过@Bean注解来定义bean
public Dog dog(){
return new Dog();
}
}
2.2 定义实体类
定义的实体类:
User使用的是@Component注解
@Component
@Data
public class User {
@Value("翁博梁")
private String username;
private Cat cat;
private Dog dog;
@Autowired
public void setCat(Cat cat) {
this.cat = cat;
}
@Autowired
public void setDog(Dog dog) {
this.dog = dog;
}
}
Cat使用的是@Component注解
@Data
@Component
public class Cat {
@Value("球球")
private String name;
}
Dog使用的是@Bean注释, 在SpringConfig类中
@Data
public class Dog {
private String name = "豆豆";
}
2.3 定义测试类
测试类
@Test
public void test(){
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
System.out.println(context.getBean("user"));
System.out.println(context.getBean("cat"));
System.out.println(context.getBean("dog"));
}
测试结果
User(username=翁博梁, cat=Cat(name=球球), dog=Dog(name=豆豆))
Cat(name=球球)
Dog(name=豆豆)
2.4 引入其他配置类
创建一个新的配置类:SpringConfig2
@Configuration
@Import(SpringConfig.class)
public class SpringConfig2 {
}
通过@Import
注解来引入SpringCongif
配置类
修改测试类中引用的测试类为SpringConfig2
, 测试: