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对象不同

 

 

 

 

posted @ 2020-08-23 16:35  违和感  阅读(88)  评论(0)    收藏  举报