修改 TestIOC.java:
package cn.itcast.ioc; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestIOC { @Test public void testUser(){ //1.加载 spring 配置文件,根据创建对象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.得到配置创建的对象 UserService userService = (UserService) context.getBean("userService"); userService.add(); } }成功在控制台输出 UserService类的 add() 方法和注入的属性:
通过注解创建 ioc 实例上述实例是通过配置 xml 文件来实现创建对象的功能,spring 也提供了另一种方式来实现上述功能:注解。
注解介绍代码里面特殊标记,使用注解可以完成功能
注解写法 @注解名称(属性名称=属性值)
注解使用在类上面,方法上面和属性上面
创建对象的四个注解@Component
@Controller
@Service
@Repository
主要是通过 Component 衍生出 其他三个在web 层、业务层、持久层注解,主要是为了后续增强。但对我来说这四个注解功能目前来说是一样的,都是创建对象。
我们重新配置一下 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/spring-beans.xsd http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here --> <!-- 开启注解扫描 (1) 到包里面扫描类,方法,属性上面是否有注解 --> <context:component-scan base-package="cn.itcast.ioc"></context:component-scan> <!-- 扫描属性上面的注解 --> <!--<context:annotation-config></context:annotation-config>--> </beans>修改 User.java 文件:
package cn.itcast.ioc; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; @Service(value = "user") //相当于<bean/> @Scope(value = "prototype") //多实例 public class User { public void add(){ System.out.println("add........"); } }修改TestIOC.java:
package cn.itcast.ioc; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestIOC { @Test public void testUser(){ //1.加载 spring 配置文件,根据创建对象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.得到配置创建的对象,这里的getBean()方法中的 user 为User类通过注解的 value 值。 User user = (User) context.getBean("user"); user.add(); } }控制台成功输入User 类的 add()方法:
通过注解注入属性同样的,我们可以通过使用注解注入属性。
这里有两种方式,我们可以通过使用 @Autowired(自动注入)或 @Resource(name="value")(name属性值:注解创建对象 value 值),推荐使用后一种。
注:使用注解不需要 set 方法。
还是举个栗子:
在 src/main/java/ 下创建 package 和 UserDao.java 和 UserService.java。
UserDao.java:
package cn.itcast.anno; import org.springframework.stereotype.Service; @Service(value = "userDao") public class UserDao { public void add(){ System.out.println("dao........."); } }UserService.java:
package cn.itcast.anno; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service(value = "userService") public class UserService { //得到dao 对象 //定义 dao 类型 //方法一:在 dao属性上面使用注解,完成对象注入 // @Autowired // private UserDao userDao; //使用注解不需要set 方法 //方法二: //name属性值: 注解创建 dao对象 value 值 @Resource(name = "userDao") private UserDao userDao; public void add(){ System.out.println("service......."); userDao.add(); } }