Spring注解
完全使用注解在开发中并不是特别多,但是在框架整合的时候往往会用到注解的方式。
IOC装配Bean(使用注解的方式):
Spring2.5中引入了使用注解去定义Bean:
@Component描述Spring框架中的Bean。
实例讲解注解
首先,
编写一个Dao:
package com.js.demo1; import org.springframework.stereotype.Repository; @Repository("userDao") public class UserDao { }
编写一个bean:
package com.js.demo1; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; 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.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; /** * 注解的方式装配bean * @author hdb * */ //@Component("userService") @Service("userService") @Scope public class UserService { @Value(value="小蒋") private String info; // @Autowired // @Qualifier("userDao") @Resource(name="userDao") private UserDao userDao; @Override public String toString() { return "UserService [info=" + info + ", userDao=" + userDao + "]"; } public void sayHello(){ System.out.println("Hello Spring annotation..."+info); } @PostConstruct public void setup(){ System.out.println("初始化..."); } @PreDestroy public void teardown(){ System.out.println("销毁..."); } }
然后,修改applicationContext.xml(为什么还需要配置文件呢?是为了告诉Spring应该去哪些包下扫描使用注解配置的bean),配上xmlns: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></context:annotation-config>
</beans>
接下来,配置context:component-scan,告诉Spring需要扫描哪些包:
<?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">
<!-- 纯用注解配置bean的情况下context:annotation-config可以省略,当混合使用xml和注解配置bean的时候就不能省略了-->
<context:annotation-config></context:annotation-config>
<!-- 配置扫描注解的包 -->
<context:component-scan base-package="com.js"></context:component-scan>
</beans>
编写测试类
package com.js.demo1; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestAnnotation { @Test public void demo1(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService)applicationContext.getBean("userService"); UserService userService2 = (UserService)applicationContext.getBean("userService"); userService.sayHello(); System.out.println("userService:"+userService); System.out.println("userService2:"+userService2); ((AbstractApplicationContext) applicationContext).close(); } }
@Component
除了@Component之外,Spring还提供了与之等效的三个注解(为了以后分层开发):
@Repository:用于对DAO实现类进行标注
@Service:用于对Service实现类进行标注
@Controller:用于对Controller实现类进行标注
普通属性(使用@Value注解):@Value
对象属性(使用@Autowired [ˈɔ:təʊwaɪəd]注解,默认使用类型注入):@Autowired
@Autowired可以带参数,required,默认为true,表示不忽略异常。
@Autowired(required=false)表示忽略异常。
@Qualifier(命名)ˈkwɒlɪfaɪə(r)]
一般情况下我们使用名称注入,也就是需要给UserDao的@Repository注解加上名称,
例如:@Repository("userDao"),然后在@Autowired注解下再加一个@Qualifier("userDao")去装配,注意名称要一致,否则注入失败。
Spring默认使用类型注入,也就是此处的UserDao类型会默认匹配UserDao这个bean。
简言之,按名称注入:@Repository(命名)+@Autowired+@Qualifier(命名),按类型注入:@Repository+@Autowired
@Resource注解和@Autowired+@Qualifier(命名)功能有点类似:
例如上述例子中UserService中的注解:
@Autowired(required=false)
@Qualifier("userDao")
private UserDao userDao;
可以改写为:
@Resource(name="userDao")
private UserDao userDao;
运行同样成功。
Spring可以在创建和卸载bean的时候调用bean的两个生命周期方法:
<bean />
这是之前我们采用xml配置的方式,采用注解方式可以实现同样的操作:
@Service("userService") @Scope public class UserService { // 省略代码 }
实际开发中使用XML还是注解?
XML:
* bean管理
注解;
* 注入属性的时候比较方便.
两种方式结合:一般使用XML注册Bean,使用注解进行属性的注入
在applicationContext.xml中配置
<!-- 纯用注解配置bean的情况下context:annotation-config可以省略,当混合使用xml和注解配置bean的时候就不能省略了-->
<!-- 作用是使@Resource、@PostConstruct、@PreDestroy、@AutoWired生效-->
<context:annotation-config></context:annotation-config>
XML注册Bean,注解属性注入实例
首先,
编写一个Dao:
package com.js.demo4; import org.springframework.stereotype.Repository; @Repository("0rderDao") public class OrderDao { }
package com.js.demo4; import org.springframework.stereotype.Repository; @Repository("customerDao") public class CustomerDao { }
编写一个bean:
使用注解传入的属性就不在需要setter方法,也不再需要Component-scan
package com.js.demo4; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; public class CustomerService { //注解进行属性注入 @Autowired @Qualifier("customerDao") private CustomerDao customerDao; @Autowired @Qualifier("orderDao") private OrderDao orderDao; @Override public String toString() { return "CustomerService [customerDao=" + customerDao + ", orderDao=" + orderDao + "]"; } }
修改applicationContext.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: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"> <!-- 纯用注解配置bean的情况下context:annotation-config可以省略,当混合使用xml和注解配置bean的时候就不能省略了--> <!-- 作用是使@Resource、@PostConstruct、@PreDestroy、@AutoWired生效--> <context:annotation-config></context:annotation-config> <bean ></bean> <bean ></bean> <bean > </bean> </beans>
编写测试类
package com.js.demo4; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestXmlAnnation { @Test public void demo(){ ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml"); CustomerService customerService = (CustomerService) applicationContext.getBean("customerService"); System.out.println("customerService:"+customerService); } }