使用注解开发-Spring
使用注解开发-Spring

一. 使用xml文件

1.1 引入spring-aop包:

在Spring4之后, 想要使用注解开发, 需要引入aop包
Spring_学习06_spring

一般推荐直接导入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, 测试:
Spring_学习06_测试类_02