7.Spring 注解注入
注解注入:
注解:就是一个类,使用@注解名称
开发中:使用注解取代xml配置文件
@Component:取代<bean class="xxx">
@Component("id"):取代<bean id="xx" class="xxx">
web开发中,提供3个@Component注解衍生注解(功能一样)取代<bean class="xxx">
@Repository("名称"):dao层
@Service("名称"):service层
@Controller("名称"):web层
@Autowired("名称"):自动根据类型注入
@Qualifier("名称"):指定自动注入的id名称
@Resource("名称")等同于@Autowired+@Qualifier
@PostConstruct: 自定义初始化
@PreDestroy:自定义销毁
案例:
============================================================
Student.java
1 package com.gyf.model; 2 3 public class Student { 4 private String name; 5 private String password; 6 private int age; 7 8 public Student() { 9 10 } 11 12 public String getName() { 13 return name; 14 } 15 16 public void setName(String name) { 17 this.name = name; 18 } 19 20 public String getPassword() { 21 return password; 22 } 23 24 public void setPassword(String password) { 25 this.password = password; 26 } 27 28 public int getAge() { 29 return age; 30 } 31 32 public void setAge(int age) { 33 this.age = age; 34 } 35 36 public Student(String name, String password) { 37 this.name = name; 38 this.password = password; 39 } 40 41 public Student(String name, int age) { 42 this.name = name; 43 this.age = age; 44 } 45 46 @Override 47 public String toString() { 48 return "Student{" + 49 "name='" + name + '\'' + 50 ", password='" + password + '\'' + 51 ", age=" + age + 52 '}'; 53 } 54 }
接口:IUserService.java
1 package com.gyf.service; 2 3 import com.gyf.model.Student; 4 5 public interface IUserService { 6 7 void add(Student student); 8 }
①xml配置的时候
接口实现类:UserServiceImpl.java
1 package com.gyf.service; 2 3 import com.gyf.model.Student; 4 import org.springframework.stereotype.Component; 5 6 7 public class UserServiceImpl implements IUserService { 8 9 @Override 10 public void add(Student student) { 11 System.out.println("添加用户.."+student); 12 } 13 }
beans7.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd"> 7 <!--在类中声明@Component相当于配置了 --> 8 <bean id="userService" class="com.gyf.service.UserServiceImpl"></bean> 9 10 </beans>
main.java
1 public class Run7 { 2 @Test 3 public void test() { 4 //注解来取代xml中bean的配置 5 ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml"); 6 //xml配置的时候 7 IUserService userService = (IUserService)context.getBean("userService"); 8 Student student = new Student(); 9 student.setName("alex"); 10 student.setPassword("12345"); 11 student.setAge(12); 12 userService.add(student); 13 } 14 }
=============================
结果:
UserServiceImpl()。。调用了
添加用户..Student{name='alex', password='12345', age=12}
②注解
beans7.xml
添加如下的配置
xmlns:p="http://www.springframework.org/schema/p"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
开启注解
<context:annotation-config/>
配置注解位置
<context:component-scan base-package="xxx"/>
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 http://www.springframework.org/schema/context/spring-context.xsd"> 10 <!--开启注解--> 11 <context:annotation-config /> 12 <!--注解的位置--> 13 <context:component-scan base-package="com.gyf"/> 14 <!--在类中声明@Component相当于配置了--> 15 <bean id="userService" class="com.gyf.service.UserServiceImpl"></bean> 16 17 </beans>
@Component(没有配置id)
接口实现类:UserServiceImpl.java
1 package com.gyf.service; 2 3 import com.gyf.model.Student; 4 import org.springframework.stereotype.Component; 5 6 @Component 7 public class UserServiceImpl implements IUserService { 8 9 @Override 10 public void add(Student student) { 11 System.out.println("添加用户.."+student); 12 } 13 }
main.java
1 public class Run7 { 2 @Test 3 public void test() { 4 //注解来取代xml中bean的配置 5 ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml"); 6 //如果@Component没有配置id,通过类型获取,这个类型可以是接口也可以是实现类 7 //IUserService userService = (IUserService)context.getBean(IUserService.class); 8 IUserService userService = (IUserService)context.getBean(UserServiceImpl.class); 9 (IUserService)context.getBean("userService"); 10 Student student = new Student(); 11 student.setName("alex"); 12 student.setPassword("12345"); 13 student.setAge(12); 14 userService.add(student); 15 } 16 }
==============================
结果:
UserServiceImpl()。。调用了
添加用户..Student{name='alex', password='12345', age=12}
@Component(配置了id)
接口实现类:UserServiceImpl.java
1 package com.gyf.service; 2 3 import com.gyf.model.Student; 4 import org.springframework.stereotype.Component; 5 6 @Component("userService") 7 public class UserServiceImpl implements IUserService { 8 9 @Override 10 public void add(Student student) { 11 System.out.println("添加用户.."+student); 12 } 13 }
main.java
1 public class Run7 { 2 @Test 3 public void test() { 4 //注解来取代xml中bean的配置 5 ApplicationContext context = new ClassPathXmlApplicationContext("beans7.xml"); 6 //如果@Component("userService")配置了id,就可以通过id来获取 7 IUserService userService = (IUserService)context.getBean("userService"); 8 Student student = new Student(); 9 student.setName("alex"); 10 student.setPassword("12345"); 11 student.setAge(12); 12 userService.add(student); 13 } 14 }
========================
结果:
UserServiceImpl()。。调用了
添加用户..Student{name='alex', password='12345', age=12}
======================================================================================================================================================
注解案例(action--service--dao)
UserAction.java
1 package com.gyf.web.action; 2 3 import com.gyf.model.Student; 4 import com.gyf.service.IUserService; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Controller; 7 8 @Controller 9 public class UserAction { 10 11 @Autowired 12 private IUserService userService; 13 14 public void save(Student student){ 15 System.out.println("userAction...."); 16 userService.add(student); 17 } 18 }
IUserService.java
1 package com.gyf.service; 2 3 import com.gyf.model.Student; 4 5 public interface IUserService { 6 7 void add(Student student); 8 }
UserServiceImpl.java
1 package com.gyf.service; 2 3 import com.gyf.dao.IUserDao; 4 import com.gyf.model.Student; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Component; 7 8 @Component
9 public class UserServiceImpl implements IUserService { 10 11 @Autowired 12 private IUserDao userDao; 13 14 public UserServiceImpl() { 15 System.out.println("UserServiceImpl()。。调用了"); 16 } 17 18 @Override 19 public void add(Student student) { 20 System.out.println("userService添加用户.."+student); 21 userDao.add(student); 22 } 23 }
IUserDao.java
1 package com.gyf.dao; 2 3 4 import com.gyf.model.Student; 5 6 public interface IUserDao { 7 void add(Student stu); 8 }
UserDaoImpl.java
1 package com.gyf.dao; 2 3 import com.gyf.model.Student; 4 import org.springframework.stereotype.Repository; 5 6 @Repository 7 public class UserDaoImpl implements IUserDao { 8 @Override 9 public void add(Student stu) { 10 System.out.println("userDao添加用户..."+stu); 11 12 } 13 }
beans9.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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:component-scan base-package="com.gyf" /> </beans>
main.java
1 package com.gyf.test; 2 3 import com.gyf.model.Student; 4 import com.gyf.web.action.UserAction; 5 import org.junit.Test; 6 import org.springframework.context.ApplicationContext; 7 import org.springframework.context.support.ClassPathXmlApplicationContext; 8 9 public class Run9 { 10 @Test 11 public void test() { 12 //xml配置web-service-dao 13 ApplicationContext context = new ClassPathXmlApplicationContext("beans9.xml"); 14 15 UserAction userAction = (UserAction)context.getBean(UserAction.class); 16 Student student = new Student(); 17 student.setName("alex"); 18 student.setPassword("12345"); 19 student.setAge(12); 20 userAction.save(student); 21 } 22 }
=================================================
结果:
UserServiceImpl()。。调用了
userAction....
userService添加用户..Student{name='alex', password='12345', age=12}
userDao添加用户...Student{name='alex', password='12345', age=12}
========================================
@Scope,@Qualifier,@Resource三个注解的用法
下面列出必要的代码(红色标记),其他代码和上面一样。
UserAction.java
1 package com.gyf.web.action; 2 3 import com.gyf.model.Student; 4 import com.gyf.service.IUserService; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.beans.factory.annotation.Qualifier; 7 import org.springframework.context.annotation.Scope; 8 import org.springframework.stereotype.Controller; 9 10 import javax.annotation.Resource; 11 12 @Controller 13 @Scope("prototype")//多例 singtone:单例 单词释义【prototype:原型; 雏形; 最初形态;】 14 public class UserAction { 15 /** 16 * Autowired是根据类型注入值 17 * 如果你是一个接口,会从容器找接口实现类 18 * 如果你是一个类,就查找类 19 */ 20 21 // @Autowired //spring自动注入userService赋值 22 // @Qualifier("myUserService")//根据指定的id注入属性【用的比较少】 23 @Resource(name = "myUserService")//等效于上面两行【用的比较少】 24 private IUserService userService; 25 26 public void save(Student student){ 27 System.out.println("userAction...."); 28 userService.add(student); 29 } 30 }
UserServiceImpl.java
1 package com.gyf.service; 2 3 import com.gyf.dao.IUserDao; 4 import com.gyf.model.Student; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Component; 7 8 @Service("myUserService") 9 public class UserServiceImpl implements IUserService { 10 11 @Autowired 12 private IUserDao userDao; 13 14 public void setName(String name) { 15 this.name = name; 16 } 17 18 public UserServiceImpl() { 19 System.out.println("UserServiceImpl()。。调用了"); 20 } 21 22 @Override 23 public void add(Student student) { 24 System.out.println("userService添加用户.."+student); 25 userDao.add(student); 26 } 27 }
main.java
1 package com.gyf.test; 2 3 import com.gyf.model.Student; 4 import com.gyf.web.action.UserAction; 5 import org.junit.Test; 6 import org.springframework.context.ApplicationContext; 7 import org.springframework.context.support.ClassPathXmlApplicationContext; 8 9 public class Run9 { 10 @Test 11 public void test() { 12 //xml配置web-service-dao 13 ApplicationContext context = new ClassPathXmlApplicationContext("beans9.xml"); 14 15 UserAction userAction = (UserAction)context.getBean(UserAction.class); 16 UserAction userAction1 = (UserAction)context.getBean(UserAction.class); 17 Student student = new Student(); 18 student.setName("alex"); 19 student.setPassword("12345"); 20 student.setAge(12); 21 userAction.save(student); 22 System.out.println(userAction); 23 System.out.println(userAction1); 24 } 25 }
===============================
结果:
UserServiceImpl()。。调用了
userAction....
userService添加用户..Student{name='alex', password='12345', age=12}
userDao添加用户...Student{name='alex', password='12345', age=12}
com.gyf.web.action.UserAction@1e730495
com.gyf.web.action.UserAction@7d3a22a9
因为scope("prototype")注解是多例,所以userAction对象不同