- 在Spring4之后,要使用注解开发,必须要保证aop的包导入了
- 使用注解需要导入context约束,增加注解支持
创建模型——spring-06-anno
在resource下新建applicationcontext.xml配置文件
<?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="com.kuang" />
<!-- 开启注解支持-->
<context:annotation-config/>
</beans>
1.bean
2.属性如何注入
//等价于<bean id="user" class="com.kuang.pojo.User" />
//@Component 组件,该注解等价于new了一个对象
@Component
public class User {
// @ Value等价于 <property name="name" value="萧红" />
@Value("晓晓")
public String name;
}
3.衍生的注解
- @Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层
⭕dao【@Repository】
⭕service【@Service】
⭕controller【@Controller】
这四个注解功能都是一样的,都是将某个类注册到Spring中,装配Bean
4.自动装配
@Autowired:自动装配。
●@Autowired通过byType的方式实现,而且必须要求这个对象存在
●如果Autowired不能唯一自动装配上属性,则需要通过@Qualifier(value="xxx")去配置@Autowired使用,指定一个唯一的bean对象注入-
●如果显示定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空 @Autowired(required = false)
@Nullable
●字段标记了这个注解,说明这个字段可以为null
@Resource:
●自动装配。先通过名字,没有再通过类型
●@Resource默认通过byName方式实现,如果找不到名字,则通过byType实现!如果两个都找不到,就会报错
5.作用域
//相当于 <bean id="user" class="com.kuang.pojo.User" scope="singleton" />
@Scope("singleton")
可选值:
6.小结
xml与注解:
⭕xml:更加万能,适用于任何场合!维护简单方便
⭕注解:不是自己的类使用不了,维护相对复杂
最佳实践
⭕xml用来管理bean
⭕注解只负责完成属性的注入
⭕我们在使用过程中,只需要注意一个问题,必须让注解生效,就需要开启注解的支持
<!-- 自动扫描包,指定要扫描的包,这个包下的注解就会生效-->
<context:component-scan base-package="com.kuang" />
<!-- 开启注解支持-->
<context:annotation-config/>
7.使用Java的方式配置Spring
我们现在要完全不适用Spring的xml配置了,全权交给Java来做
JavaConfig是Spring的一个子项目,在Spring4之后,它成为了核心功能
1.新建Model——spring-07-anno2
2.新建包com.kuang.pojo,包中创建User实体类对象
package com.kuang.pojo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//@Component注解的意思是这个类被Spring接管了,被注册到了Spring容器中
@Component
public class User {
@Value("晓晓1111")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
3.创建com.kuang.config包存放配置类,在该包中创建配置类KuangConfig和KuangConfig2
- KuangConfig
package com.kuang.config;
import com.kuang.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration //这个也会被Spring容器托管,注册到容器中,因为它本来就是一个@Component
//@Configuration代表这是一个配置类,就和我们之前的beans.xml是一样的
//扫描包
@ComponentScan("com.kuang")
@Import(KuangConfig2.class)
public class KuangConfig {
//注册一个bean就相当于我们之前写的一个bean标签
// 这个方法的名字,就相当于bean标签中的id属性
// 这个方法的返回值,就相当于标签中的class属性
@Bean
public User getUser(){
return new User();//返回要注入到bean的对象
}
}
- KuangConfig2
package com.kuang.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class KuangConfig2 {
}
4.测试类
import com.kuang.config.KuangConfig;
import com.kuang.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class myTest {
@Test
public void test(){
// 如果完全使用了配置类方式去做,我们只能通过AnnotationConfig上下文来获取容器,通过配置了的class对象加载
ApplicationContext context = new AnnotationConfigApplicationContext(KuangConfig.class);
User getUser = (User) context.getBean("getUser");
System.out.println(getUser.getName());
}
}
注解:
@Configuration
- @Configuration代表这是一个配置类,就和我们之前的beans.xml是一样的
- 这个也会被Spring容器托管,注册到容器中,因为它本来就是一个@Component
@ComponentScan(“包名”)
- 扫描包
- 相当于配置类中的
<!-- 自动扫描包-->
<context:component-scan base-package="com.kuang" />
@Import(类名)
如
//导入KuangConfig2配置类
@Import(KuangConfig2.class)
@Bean
- 注册一个bean就相当于我们之前写的一个bean标签
- 这个方法的名字,就相当于bean标签中的id属性
- 这个方法的返回值,就相当于标签中的class属性
例:
@Bean
public User getUser(){
return new User();//返回要注入到bean的对象
}
@Component
- @Component注解的意思是这个类被Spring接管了,被注册到了Spring容器中