day38 17-Spring的Bean的属性注入:注解方式
这个类已经可以由Spring控制反转了,那么属性呢?属性分为普通属性和对象属性两部分。
JSR是一个组织,和W3C一样是定义一些标准的.它里面也定义了一歌注解,Spring对这个注解也是支持的.其实这个@Resource注解和@AutoWired以及@Qualifier整合到一起它俩的功能是类似的。
package cn.itcast.spring3.demo1; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; /** * 注解的方式装配Bean. * @author zhongzh * */ //在Spring配置文件中<bean id="userService" class="cn.itcast.demo1.UserService"> //其实也需要核心配置文件,只不过不是用来装配bean了,你得告诉Spring需要去哪些包下面去扫描.它得扫描到这些注解才行.它得去哪里扫描你得告诉人家才行 //@Component(value="userService") //@Component("userService") @Service(value="userService")//Service层,默认把这个类UserService交由Spring来管理了 public class UserService { //如果是普通属性,可以使用value注解来注入了 @Value(value="itcast") private String info; //@Autowired//如果是复杂类型或者是对象属性使用@Autowired这个注解:自动装配默认使用类型注入. //@Autowired(required=false)//AutoWired的属性required=false忽略异常。默认required=true出异常就终止了.required=false依然可以注入,但是出异常的话注入的是null值. //required属性出异常不管了,required=false出异常程序照样往下执行,成不成功另外说了.默认required=true,有异常就不注入就停止了. //@Qualifier("userDao") //@Autowired(required=true)//默认,一般不去改这个值 //@Qualifier("uDao")//按名称注入,@AutoWired+@Qualifier() @Resource(name="userDao")//等于@AutoWired+@Qualifeied,按名称注入 private UserDao userDao; public void sayHello(){ //System.out.println("Hello Spring Annotation....."); System.out.println("Hello Spring Annotation....."+info); } @Override public String toString() { return "UserService [info=" + info + ", userDao=" + userDao + "]"; } }
package cn.itcast.spring3.demo1; //import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; //Dao这个类正常也应该交由Spring管理. //@Component //@Repository//按类型注入 @Repository("userDao")//按名称注入 public class UserDao { }
package cn.itcast.spring3.demo1; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; //注解的方式:都是将类装载到容器中. public class SpringTest1 { @Test public void demo1(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) applicationContext.getBean("userService"); //userService.sayHello(); System.out.println(userService); } }
<?xml version="1.0" encoding="UTF-8"?> <!-- 基于注解的开发需要引入context命名空间。它就是用来配置去扫描哪些包的. --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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></context:annotation-config><!-- XML和注解混搭的时候用的 --> <!-- 告诉Spring你要扫描哪些包下的东西 --> <!-- <context:component-scan base-package="cn.itcast.spring3.demo1"> --> <context:component-scan base-package="cn.itcast.spring3.demo1"><!-- 纯注解用扫描的就行 --> </context:component-scan> </beans>