1、使用注解开发
(1)前置操作
1、导入相应jar包-aop
2、配置context约束
3、配置扫描哪些包下的注解
<?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:component-scan base-package="cn.qqa"/>
<!--加载注解驱动-->
<context:annotation-config/>
</beans>
(2)编写Bean类
1、属性注入
(1)可以不用提供set方法,直接在直接名上添加@value("值")
package cn.qqa.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//组件
@Component
//等价于<bean id="user" class="cn.qqa.pojo.User"/>
public class User {
//相当于<property name="name" value="xxx"/>
@Value("xxx")
public String name;
}
(2)如果提供了set方法,在set方法上添加@value("值");
@Component("user")
public class User {
public String name;
@Value("xxx")
public void setName(String name) {
this.name = name;
}
}
(3)衍生注解
这些注解,就是替代了在配置(.xml)文件当中配置的步骤而已!更加的方便快捷!
@Component有三个衍生注解
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
- @Controller:web层
- @Service:service层
- @Repository:dao层
写上这些注解,就相当于将这个类交给Spring管理装配了!
(4)Autowired
上篇博客
(5)作用域(@Scope)
-
singleton:默认的,Spring会采用单例模式创建这个对象。关闭工厂 ,所有的对象都会销毁。
-
prototype:多例模式。关闭工厂 ,所有的对象不会销毁。内部的垃圾回收机制会回收。
package cn.qqa.controller;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
@Controller("userController")
@Scope("singleton")
public class UserController {
}
(6)小结
XML与注解比较
-
XML可以适用任何场景 ,结构清晰,维护方便
-
注解不是自己提供的类使用不了(即使用别人写好的类时,只能用xml),开发简单方便。
xml与注解整合开发 :推荐最佳实践
-
xml管理注册Bean
-
注解完成属性注入
-
使用过程中, 可以不用扫描,扫描是为了类上的注解
<context:annotation-config/>
作用:
-
进行注解驱动注册,从而使注解生效
-
用于激活那些已经在spring ioc容器里注册过的bean上面的注解,也就是显式的向Spring ioc容器注册。
-
如果不扫描包,就需要手动配置bean。
-
如果不加注解驱动,则注入的值为null!
2、使用注解配置
(1)实体类
package cn.qqa.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//此注解的意思就是说明这个类被IOC容器接管了,注册到了容器中
@Component
public class User {
private String name;
public String getName() {
return name;
}
//属性注入值
@Value("qqa")
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
(2)配置类
MyConfig.java
package cn.qqa.config;
import cn.qqa.pojo.User;
import org.springframework.context.annotation.*;
//等价于 <beans>
//也会被容器接管,注册到容器中,他本来就是一个@Component
//@Configuration代表这是一个配置类,和beans.xml类似
@Configuration
@ComponentScan("cn.qqa.pojo")
@Import(MyConfig2.class)
public class MyConfig {
//注册一个bean,就相当于我们之前写的一个bean标签
//这个方法的名字就相当于bean标签中的id属性
//这个方法的返回值,就相当于bean标签中的class属性
@Bean
public User getUser(){
//就是要返回注入到bean的对象
return new User();
}
}
MyConfig2.java
package cn.qqa.config;
import cn.qqa.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//等价于 <beans>
//也会被容器接管,注册到容器中,他本来就是一个@Component
//@Configuration代表这是一个配置类,和beans.xml类似
@Configuration
@ComponentScan("cn.qqa.pojo")
public class MyConfig2 {
//注册一个bean,就相当于我们之前写的一个bean标签
//这个方法的名字就相当于bean标签中的id属性
//这个方法的返回值,就相当于bean标签中的class属性
@Bean
public User getUser(){
//就是要返回注入到bean的对象
return new User();
}
}
关于这种Java类的配置方式,我们在之后的SpringBoot 和 SpringCloud中还会大量看到!