使用以@符号嵌入Java代码内部的annotaton注释
我们先来看一个传统的完全使用xml配置的例子
Office.java
package spring3.basic.annotation.compare; public class Office { private String officeNo = "001"; public String getOfficeNo() { return officeNo; } public void setOfficeNo(String officeNo) { this.officeNo = officeNo; } @Override public String toString() { return "Office No:" + officeNo; } }
Car.java:
package spring3.basic.annotation.compare; public class Car { private String brand; private double price; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "brand:" + brand + "," + "price:" + price; } }
Boss.java(需要被注入的组合业务类)
package spring3.basic.annotation.compare; public class Boss { private Car car; private Office office; public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public Office getOffice() { return office; } public void setOffice(Office office) { this.office = office; } @Override public String toString() { return "Car:" + car + "\n" + "Office:" + office; } }
接下来,我们能需要通过配置文件来实例化我们的主类和辅助的注入类
classicContext.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="boss" class="spring3.basic.annotation.compare.Boss" > <property name="car" ref="car" /> <property name="office" ref="office" /> </bean> <bean id="office" class="spring3.basic.annotation.compare.Office"> <property name= "officeNo" value= "002" /> </bean> <bean id= "car" class = "spring3.basic.annotation.compare.Car"> <property name="brand" value="BMW X700" /> <property name="price" value="2000" /> </bean> </beans>
编写测试类
ClassicBossDemo.java
package spring3.basic.annotation.compare; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ClassicBossDemo { public static void main(String[] args) { String[] locations = { "annotation/classicContext.xml" }; ApplicationContext ctx = new ClassPathXmlApplicationContext(locations); Boss boss = (Boss)ctx.getBean("boss"); System.out.println(boss); } }
运行结果:
Car:brand:BMW X700,price:2000.0
Office:Office No:002
现在来看一下如果利用注释怎么做
首先介绍一下@Autowired注释
需要被注入的业务类的属性,一般是通过设置set方法后,再通过spring的配置文件
进行注入
如果设置了@Autowired自动绑定后,spring会自动根据ByType的形式去寻找对应类型下的类
在配置文件中,我们需要做的是
1. 指定spring通过annotation来注入
<context:annotation-config />
2. 指定注入类的搜索包
<context:component-scan base-package="spring3.basic.annotation.compare" />
如果同一个类有两个实例,需要去注入,怎么办呢?
我们可以通过@Qualifier关键字,把默认的ByType注入改为ByName注入
@component关键字
可以让我们省去在配置文件中实例化bean,可以把它和配置文件结合使用
因为,默认使用@component实例化类,类的成员属性是不赋值的,如果需要初始化
属性,还得使用配置文件
说了那么多了,下面来看一下代码
Farm.java
package spring3.basic.annotation.compare; import org.springframework.stereotype.Component; public class Farm { private String farmNo; public String getFarmNo() { return farmNo; } public void setFarmNo(String farmNo) { this.farmNo = farmNo; } @Override public String toString() { return "Farm No:" + farmNo; } }
Cow.java
package spring3.basic.annotation.compare; import org.springframework.stereotype.Component; public class Cow { private String color; private double price; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Color: " + color + "," + "Price: " + price; } }
Peasant.java(业务主类)
package spring3.basic.annotation.compare; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @Component public class Peasant { @Autowired @Qualifier("whitecow") private Cow cow; @Autowired private Farm farm; public Cow getCow() { return cow; } public Farm getFarm() { return farm; } @Override public String toString() { return "Cow: " + cow + "\n" + "Farm: " + farm; } }
annotationContext.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config /> <context:component-scan base-package="spring3.basic.annotation.compare" /> <bean id="farm" class="spring3.basic.annotation.compare.Farm"> <property name= "farmNo" value= "f001" /> </bean> <bean id= "whitecow" class = "spring3.basic.annotation.compare.Cow"> <property name="color" value="white" /> <property name="price" value="1000" /> </bean> <bean id= "blackcow" class = "spring3.basic.annotation.compare.Cow"> <property name="color" value="black" /> <property name="price" value="1200" /> </bean> </beans>
编写测试类
AnnotationPeasantDemo.java
package spring3.basic.annotation.compare; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AnnotationPeasantDemo { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("annotation/annotationContext.xml"); Peasant peasant = (Peasant)ctx.getBean("peasant"); System.out.println(peasant); } }
运行结果:
Cow: Color: white,Price: 1000.0
Farm: Farm No:f001