Spring 学习笔记(六)- 用注解的方式配置 bean

我们前面学了用 xml 来配置 Bean,但是在实际开发中,可能使用注解配置 Bean,使用的还要广泛一些,因为更方便简洁!

1. 什么是注解

  • 传统的 Spring 做法是使用 .xml 文件来对 bean 进行注入或者是配置 aop、事务,这么做有两个缺点:
    1. 如果所有的内容都配置在 .xml 文件中,那么 .xml 文件将会十分庞大;如果按需求分开 .xml 文件,那么 .xml 文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低
    2. 在开发中在 .java文件和 .xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率
  • 为了解决这两个问题,Spring 引入了注解,通过"@XXX"的方式,让注解与 Java Bean 紧密结合,既大大减少了配置文件的体积,又增加了 Java Bean 的可读性与内聚性。

2. Spring 注解配置初始化对象()

1. spring 中使用注解配置对象前,要在配置文件中配置 context:component-scan 标签告诉 spring 框架,配置了注解的类的位置

配置文件 applicationContext.xml:

 <context:component-scan base-package="www.xq.spring.bean"></context:component-scan>

2. 注解说明:

Component 是最初spring框架设计的,后来为了标识不同代码层,衍生出 Controller,Service,Repository 三个注解 作用相当于配置文件的bean标签,被注解的类,spring始化时,就会创建该对象

1. @Component("user")  //给类注解
2. @Service("user") // service层
3. @Controller("user") // web业务层
4. @Repository("user")//dao层
5. @Scope(scopeName="singleton") //等同于配置文件的scope属性
1. @Value(value="188") //给值属性赋值,可以用在方法上或者属性上
2. @Resource(name="car") //给对象赋值,该值car必须要已经声明(在配置文件中已经配置,或者在类对应中已经注解)
3. @PostConstruct //指定该方法在对象被创建后马上调用 相当于配置文件中的init-method属性
4. @PreDestroy //指定该方法在对象销毁之前调用 相当于配置文件中的destory-method属性
5. @Autowired //自动装配对象赋值@Qualifier("car2") 一起使用 告诉spring容器自动装配哪个对象

3. 代码举例

先看一个不使用注解的Spring示例,在这个示例的基础上,改成注解版本的,这样也能看出使用与不使用注解之间的区别.

1. 定义三个 bean

Tiger
public class Tiger {

	private String tigerName;
	
	public void setTigerName(String tigerName) {
		this.tigerName = tigerName;
	}

	public String getTigerName() {
		return tigerName;
	}
	
	@Override
	public String toString() {
		return "Tiger [tigerName=" + tigerName + "]";
	}
}
monkey
public class Monkey {
	
	private String monkeyName;
	
	public void setMonkeyName(String monkeyName) {
		this.monkeyName = monkeyName;
	}
	
	public String getMonkeyName() {
		return monkeyName;
	}

	@Override
	public String toString() {
		return "Monkey [monkeyName=" + monkeyName + "]";
	}
}    
Zoo
public class Zoo {
	
	private Tiger tiger;
	private Monkey monkey;

	public Tiger getTiger() {
		return tiger;
	}

	public void setTiger(Tiger tiger) {
		this.tiger = tiger;
	}

	public Monkey getMonkey() {
		return monkey;
	}

	public void setMonkey(Monkey monkey) {
		this.monkey = monkey;
	}

	@Override
	public String toString() {
		return "Zoo [tiger=" + tiger + ", monkey=" + monkey + "]";
	}
	
}

2. 配置 applicationContext.xml

    <bean id="zoo" class="www.xq.spring.bean.Zoo" 
		p:monkey-ref="monkey" p:tiger-ref="tiger"></bean>
	
	<bean id="tiger" class="www.xq.spring.bean.Tiger">
		<property name="tigerName" value="tt"></property>
	</bean>
	
	<bean id="monkey" class="www.xq.spring.bean.Monkey">
		<property name="monkeyName" value="mm"></property>
	</bean>

前面是不用注解,下面我们使用注解

1. applicationContext.xml

<context:component-scan base-package="www.xq.spring.bean"></context:component-scan>

2. 在 bean 中加入注解

tiger
@Component
public class Tiger {
	
	@Value(value="ttt")//通过反射,来给属性赋值,只有一个值时,value 可以省略
	private String tigerName;
}	
monkey
@Component//后面不写名字的时候,这个对象名字默认为 Monkey 中的 T 变小写,也就是为 monkey
public class Monkey {
	
	@Value("mmm")
	private String monkeyName;
	
	public void setMonkeyName(String monkeyName) {
		this.monkeyName = monkeyName;
	}
	
	@Value("mmm")//效果是一样的,都是给属性赋值,但是方法不一样,这里是调用 set 方法给属性赋值
	public String getMonkeyName() {
		return monkeyName;
	}
}
zoo
@Component//等价于 xml 中的 <bean> 标签并 id=zoo 
public class Zoo {
	
	@Resource(name="tiger")//等价于配置 ref=tiger ,前提是 tiger 这个对象在容器中
	private Tiger tiger;
	
	@Resource(name="monkey")
	private Monkey monkey;
}

3. 测试

@Test
public void testAnnotation() {
	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
	Zoo zoo = (Zoo) ctx.getBean("zoo");
	System.out.println(zoo);
}

4. 运行结果

Zoo [tiger=Tiger [tigerName=ttt], monkey=Monkey [monkeyName=mmm]]

说一下@Resource的装配顺序:

1. @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

2. 指定了name或者type则根据指定的类型去匹配bean

3. 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值