spring注解(Component、依赖注入、生命周期、作用域)

本文内容纲要:spring注解(Component、依赖注入、生命周期、作用域)

1、注解

注解就是一个类,使用@加上注解名称,开发中可以使用注解取代配置文件

2、@Component 取代,@Component 取代

(1)创建一个类(该类与dao层无联系,是一个单独的类)

@Component("studentService")

public class StudentServiceImpl implements StudentService {

public void addStudent(){

System.out.println("StudentService的实现类的Add方法!!");

}

}

(2)创建配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns="http://www.springframework.org/schema/beans"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="pers.zhb.service"></context:component-scan>

</beans>

(3)测试类:

public class TestCycle {

public static void main(String[] args) {

ApplicationContext applicationContext=new

ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象

StudentService studentService= (StudentService) applicationContext.getBean("studentService");

studentService.addStudent();

}

}

(4)web开发中,提供了3个@Component注解的衍生注解(功能一样),它们是spring框架为我们提供的三层使用的注解,使得我们的三层对象更加清晰

@Repository:dao层(持久层)与@Mapper的区别是,@resposity需要配置扫描,而@Mapper不需要它是利用的XML里的NameSpace

@Service:service层(业务层)

@Controller:web层(表现层)

(5)@Component注解

作用:用于把当前类的对象存入到spring容器中

属性:

value:指定bean的id,不写的时候默认是当前的类名,且首字母小写。当指定属性的值的时候就要用该值

3、依赖注入

(1)创建一个Action:

@Controller("studentAction")

public class StudentAction {

@Autowired//默认按照类型注入

private StudentService studentService;

public void execute(){

studentService.addStudent();

}

}

使用@Autowired注解(依赖注入)的时候可以写在属性或set方法处,写在属性处可以节省代码量,优先按照bean的类型去找。

(2)service层:

public interface StudentService {

public void addStudent();

}

@Service

public class StudentServiceImpl implements StudentService {

private StudentDao studentDao;

@Qualifier("studentDao")

public StudentDao getStudentDao() {

return studentDao;

}

@Autowired

public void setStudentDao(StudentDao studentDao) {

this.studentDao = studentDao;

}

public void addStudent(){

studentDao.addStudent();

}

}

(3)dao层:

public interface StudentDao {

public void addStudent();

}

@Repository("studentDao")

public class StudentDaoImpl implements StudentDao {

@Override

public void addStudent() {

System.out.println("StudentDao的实现类的Add方法!!");

}

}

(4)配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns="http://www.springframework.org/schema/beans"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

<!--扫描-->

<context:component-scan base-package="pers.zhb"></context:component-scan>

</beans>

(5)测试:

public class ActionTest {

public static void main(String[] args) {

ApplicationContext applicationContext=new

ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象

StudentAction studentAction= (StudentAction) applicationContext.getBean("studentAction");

studentAction.execute();

}

}

StudentDao的实现类的Add方法!!

Image

@Autowired

  • 可以省略类内的get和set方法以及配置文件中bean的依赖注入的内容,但是在spring容器中还是需要配置bean的,可以结合生成bean的注解使用
  • 自动按照类型注入,只要容器中有唯一一个bean对象类型和要注入的变量类型匹配,就可以注入成功
  • 出现的位置可以是变量上也可以是方法上
  • 按照类型注入的时候,如果有多个可以注入,不能注入成功的时候,可以按照名称注入(需要手动修改注入的变量名称),例如,一个接口有多个实现类,那么这些实现类就是相同类型的,注入的时候会出现问题,因为注入的时候匹配到了多个bean

Image

@Qualifier

属性value用于指定注入的bean的id

在给类成员注入的时候不能独立使用,也就是说要和Autowired注解配合使用。当有多个相同类 型 的 bean 却只 有 一个需 要 自 动 装 配 时 , 将 @Qualifier 注 解 和@Autowire 注解结合使用以消除这种混淆, 指定需要装配的确切的 bean。

@Resource

直接按照bean的id注入,可以独立使用

属性可以指定bean的id

以上三种注解都是能用于注入bean类型的数据,而基本类型和String类型无法使用上述注解

@Value:用于注入基本类型和String类型,属性用于指定值

@Required :如果你在某个java类的某个set方法上使用了该注释,那么该set方法对应的属性在xml配置文件中必须被设置,否则就会抛出BeanInitializationException。

4、生命周期

初始化:@PostConstruct

销毁:@PreDestory

分别添加到初始化和销毁方法之前。

5、bean的作用域

(1)单例对象singleton(缺省)

Image

测试:

Student student1  =(Student)applicationContext.getBean("student");

Student student2 =(Student)applicationContext.getBean("student");

System.out.println(student1==student2);

返回结果为true,说明创建的是同一个对象。在spring容器中只存在一个bean的实例,bean以单里的形式存在

(2)多例对象prototype

Image

测试:

Student student1  =(Student)applicationContext.getBean("student");

Student student2 =(Student)applicationContext.getBean("student");

System.out.println(student1==student2);

Image

返回的结果为false,创建的是两个不同的对象。每次调用getBean()的时候都会返回一个新的实例

(3)request

request: 每次 http 请求都会创建一个 bean, 该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效

(4)session

session: 在一个 HTTP Session 中, 一个 bean 定义对应一个实例(同一个Session共享一个Bean实例)。 该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。

(5)global-session

global-session:同session作用域不同的是,所有的Session共享一个Bean实例。 该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。

本文内容总结:spring注解(Component、依赖注入、生命周期、作用域)

原文链接:https://www.cnblogs.com/zhai1997/p/12696197.html

以上是 spring注解(Component、依赖注入、生命周期、作用域) 的全部内容, 来源链接: utcz.com/z/296373.html

回到顶部