说明
环境依赖:在使用spring4之后,想要使用注解形式,必须得要引入aop的包
在配置文件中,还得要引入一个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">
<!--指定扫描注解包,这个包的注解下就会失效-->
<!--开始注解支持-->
<context:annotation-config/>
</beans>
Bean的实现
之前都是使用bean的标签进行bean注入,但是实际开发中,我们一般都会使用注解
- 配置扫描哪些包下的注解
<!--指定注解扫描包,这个包下的注解就会生效-->
<context:component-scan base-package="com.zhou.pojo"/>
<!--开始注解支持-->
<context:annotation-config/>
- 在指定的包下编写类,增加注解
/*等价于<bean id="user" class="com.zhou.pojo.User">*/
@Component("user") // 默认的那个对象
public class User {
// 这个类直接赋值了。注意:这里private改为了public,可以直接访问属性
public String name="王者";
}
测试
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = context.getBean("user", User.class);
System.out.println(user);
/*public修饰词才让属性访问到了*/
System.out.println(user.name);
}
属性注入
使用注解注入属性
- 如果没有使用set方法,直接在直接名上添加@value(“值”)
/*等价于<bean id="user" class="com.zhou.pojo.User">*/
@Component("user")
public class User {
@Value("王者") /*使用这个Value注解的话就不用在下面的赋值*/
// 相当于配置文件,<property name = "name" value="王者">
public String name;
}
测试
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user = context.getBean("user", User.class);
System.out.println(user);
/*public修饰词才让属性访问到了*/
System.out.println(user.name);
}
- 如果提供了set方法,在set方法添加@value(“值”)
/*加个set方法后,可以直接在set方法上添加@value("值")
* 在set方法后,添加这个的话优先使用这个set方法的value注解的值
**/
public String name;
@Value("秦始皇")
public void setName(String name){
this.name = name;
}
测试:通过.在set方法后,添加这个的话优先使用这个set方法的value注解的值
衍生注解
@Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层
- dao【@Repository】
- service【@Service】
- controller 【@Controller】
这四个注解的功能都是一样的,都是代表将某个类注册到Spring
中,装配Bean
自动装配配置
- @Autowired:自动装配通过类型,名字
- 如果Autowired:不能唯一自动装配上属性,则需要通过@Qualifier(value=“xxx”)
- @Nullable:字段标记了这个注解,说明这个字段可以为null
- @Resoure:自动装配通过名字或者类型
作用域:
@scope
- singleton:默认的,Spring会采用单例模式创建这个对象,关闭工厂,所有的对象都会销毁。
- prototype:多例模式,关闭工厂,所有的对象不会销毁。内部的垃圾回收机制会回收。
@Component("user")
@Scope("prototype")
public class User {
public String name;
/*加个set方法后,可以直接在set方法上添加@value("值")
* 在set方法后,添加这个的话优先使用这个set方法的value注解的值
**/
@Value("秦始皇")
public void setName(String name){
this.name = name;
}
}
xml与注解比较
- XML可以适用任何场景 ,结构清晰,维护方便
- 注解不是自己提供的类使用不了,开发简单方便
xml与注解整合开发 :推荐最佳实践
- xml管理Bean
- 注解完成属性的注入
- 只要注意:必须要让注解生效,开启注解,使用注解的话,注意要指定扫描的包
<!--指定注解扫描包,这个包下的注解就会生效-->
<context:component-scan base-package="com.zhou"/>
<!--开始注解支持-->
<context:annotation-config/>
基于java类进行配置
JavaConfig原来是Spring的一个子项目,它通过java类的方式提供bean的定义的信息,在Spring4的版本,JavaConfig已成为Spring4的核心功能
- 编写一个实体类。
// 这个注解的意思就是说明这个类被Spring接管了,注册到容器中
@Component
// 这个注解的意思就是说明这个类被Spring接管了,注册到容器中
@Component
public class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
/*赋值对应bean里面的property*/
@Value("我不能输给她")
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
- config包中的配置java类
// 要是有配置文件的话,这里就是bean标签。
// 没有配置文件,要使用java,则使用Bean的注释
@Configuration
@ComponentScan("com.zhou.pojo") // 就跟我们之前看的beans.xml
@Import(JavaConfig2.class) // 把别的配置引入到主配置汇总
public class JavaConfig {
/*这个方法的名字就相当于之前的id属性*/
@Bean/*bean里面有class属性也就是返回值类型,所以返回值类型是User*/
public User getUser(){
return new User(); // 返回的User对象,要注入到bean中
}
}
如果有多个配置的话
@Configuration/*如果写多个配置的话,在主配置哪里使用import注解引入*/
public class JavaConfig2 {
}
- 测试
@Test
public void test(){
ApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
User user = (User) context.getBean("getUser");
System.out.println(user.getName());
}