引入约束
要使用注解的方式配置Bean,首先我们应该引入如下约束
<?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">
</beans>
在配置文件中进行配置
加入以下代码,可以在配置文件中进行开启注解扫描的配置
<!-- 将扫描spring.demo01路径下所有的包 -->
<context:component-scan base-package="spring.demo01"></context:component-scan>
以注解的方式来创建对象
创建一个接口(个人习惯用类实现接口的方法,其实在本例中用不用接口并不影响最终的结果)
package spring.demo01;
public interface MyInterface {
void eat();
}
创建一个实现类
package spring.demo01;
import org.springframework.stereotype.Component;
//其实下面的注解配置相当于<bean class="spring.demo01.Cat" id="cat"></bean>
@Component(value = "cat")
public class Cat implements MyInterface {
@Override
public void eat() {
System.out.println("Cat uses eat()");
}
}
实现一个测试类
package spring.demo01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Cat cat = (Cat) ctx.getBean("cat");
cat.eat();
}
}
测试结果 Cat uses eat()
证明了这个类的确已经被创建了
与@Component作用相同的注解
- @Controller 在web层中使用
- @Service 在业务层中使用
- @Repository 在持久层中使用
其实以上三个注解的使用方法与@Component是相同的,都是用于创建对象,名字的不同使注解类的用途更加清晰。
属性注入
- 使用 @Autowired 注解进行自动装配,不需要指定要注入的对象的value值,自动的根据类名去寻找对应的类来创建对象并进行对象属性的注入。
- 使用 @Resource(name=”…”),需要指定需要创建的对象的名字,这里的name对应@Component注解中的value的值,使用这个注解能够根据我们所指定的对象名准确创建出我们所需要的对象。
package spring.demo01;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component(value = "person")
public class Person {
@Resource(name="cat")
Cat cat;
@Override
public String toString() {
return "cat=[" + cat +"]" ;
}
}
我们创建一个测试类
package spring.demo01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) ctx.getBean("person");
System.out.println(person);
}
}
测试结果cat=[spring.demo01.Cat@31ea9581]
证明成功
bean的作用范围的注解
@Scopebean用于声明bean的作用范围,有两个常用的值
- singleton:默认值,表明使用单例模式创建对象
- prototype:表明使用多例模式创建对象
配置文件和注解混合使用
一般来说,我们可以使用配置文件创建对象,然后使用注解实现属性的注入
创建一个类
package spring.demo01;
import javax.annotation.Resource;
import source.Car;
public class Factory {
@Resource(name="cat")
Cat cat;
public void doSomething() {
System.out.println("Factory doSomething()");
cat.eat();
}
}
然后进行配置
<bean class="spring.demo01.Cat" id="cat"></bean>
<bean class="spring.demo01.Factory" id="factory"></bean>
<!--只会扫描属性上的注解-->
<context:annotation-config></context:annotation-config>
进行测试
package spring.demo01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
Factory factory = (Factory) ctx.getBean("factory");
factory.doSomething();
}
}
得到结果
Factory doSomething()
Cat uses eat()
证明方法是可行的