下面介绍spring通过注解进行IOC配置的方式
可以发现通过注解注入的XML配置文件比基于XML注入的XML配置文件要简单得多,
因为之前通过XML文件配置的功能都通过注解来实现了。
applicationContext.xml文件的配置
<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">
<!-- 使用IOC的注解开发,配置组件扫描(哪些包的类使用IOC注解)扫描是扫描类上的注解 -->
<context:component-scan base-package="com.lhk.spring.demo1"></context:component-scan>
</beans>
1.通过注解注入普通类型的变量
UserDao.java
package com.lhk.spring.demo1;
public interface UserDao {
public void save();
}
UserDaoImpl.java的两种方式
有set方法时,@Value("lhk")就写在set方法上面
package com.lhk.spring.demo1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 用户Dao的实现类
*/
@Component("userDao")//相当于<bean id="userDao" class="com.lhk.spring.demo1.UserDaoImpl"/>
public class UserDaoImpl implements UserDao {
private String name;
@Value("lhk")
public void setName(String name) {
this.name = name;
}
@Override
public void save() {
System.out.println("Dao中的保存方法执行了..."+name);
}
}
没有set方法时,@Value("lhk")就写在属性上面
package com.lhk.spring.demo1;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* 用户Dao的实现类
*/
@Component("userDao")//相当于<bean id="userDao" class="com.lhk.spring.demo1.UserDaoImpl"/>
public class UserDaoImpl implements UserDao {
@Value("刘宏康")
private String name;
@Override
public void save() {
System.out.println("Dao中的保存方法执行了..."+name);
}
}
@Component("userDao"):
相当于XML注入方式中的<bean id="userDao" class="com.lhk.spring.demo1.UserDaoImpl"/>。
@Value("lhk"):
相当于在属性name中注入值。
Spring 中提供@Component 的三个衍生注解:(功能目前来讲是一致的)
* @Controller :WEB 层
* @Service :业务层
* @Repository :持久层
测试方法:
@org.junit.Test
public void demo1() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ctx.getBean("userDao");
userDao.save();
}
测试结果:
Dao中的保存方法执行了...lhk
2.通过注解注入对象类型的变量
UserService.java
package com.lhk.spring.demo1;
public interface UserService {
public void save();
}
UserServiceImpl.java的两种方式
@Autowired
@Qualifier(value="userDao")
package com.lhk.spring.demo1;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("userService")// <bean id="userService" class="com.lhk.spring.demo1.UserServiceImpl">
public class UserServiceImpl implements UserService {
//注入Dao
@Autowired //设置对象类型的属性注入,但是,是按照类型完成的属性注入
@Qualifier(value="userDao")//@Autowired和@Qualifier同时使用,完成按名称的属性注入
private UserDao userDao;
@Override
public void save() {
System.out.println("UserService的save方法执行了...");
userDao.save();
}
}
@Resource(name="userDao")
package com.lhk.spring.demo1;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("userService")// <bean id="userService" class="com.lhk.spring.demo1.UserServiceImpl">
public class UserServiceImpl implements UserService {
@Resource(name="userDao")//单独使用,完成按名称的属性注入
private UserDao userDao;
@Override
public void save() {
System.out.println("UserService的save方法执行了...");
userDao.save();
}
}
@Autowired //设置对象类型的属性注入,但是,单独使用是按照类型完成的属性注入。
@Qualifier(value="userDao") @Autowired和@Qualifier同时使用,完成按名称的属性注入。
@Resource(name="userDao") 单独使用,完成按名称的对象类型的属性注入。
所以相当于@Autowired和@Qualifier(value="userDao")同时使用相当于@Resource(name="userDao")的功能。
测试方法:
@org.junit.Test
public void demo2() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) ctx.getBean("userService");
userService.save();
}
测试结果:
UserService的save方法执行了...
Dao中的保存方法执行了...lhk