龙空技术网

基于注解的DI,完成Java对象的创建

升学就业帮 202

前言:

此刻姐妹们对“java获取对象属性”大致比较关心,姐妹们都需要了解一些“java获取对象属性”的相关知识。那么小编在网上收集了一些关于“java获取对象属性””的相关资讯,希望大家能喜欢,各位老铁们快快来学习一下吧!

基于注解的DI就是通过注解完成Java对象的创建,属性的赋值.

使用注解的步骤:

1. 加入maven的依赖spring-context,在加入spring-context依赖的同时,maven会间接加入spring-aop的依赖.而使用注解必须要有spring-aop的依赖.

2. 在相关类中加入Spring的注解(Spring的注解有很多,不同的注解功能不同).

3. 在Spring的主配置文件中,加入一个组件扫描器的标签,说明注解所在项目的位置.

案例

1. 创建一个新的Maven项目.

2. 导入Spring依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version></dependency>

导入Spring依赖后会自动导入相关其他依赖,包括注解必须的spring-aop.

3. 创建相关类,着力创建学生类

Student类代码如下所示:

package com.xyr.demo01;/*** @Title* @Author Xyr* @Description: */public class Student {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}}

4. 在类中加入Spring注解,代码如下所示:

@Component(value = "s")public class Student {}

注解相关解释:

@Component: 创建对象相关注解, 相当于<bean>标签的功能

属性: value表示对象的名称,也就是相当于bean的id属性的值.

其中value的值是唯一的,创建的对象在整个Spring容器中只有一个

位置: 该注解放置在类的上面

@Component(value = "s") 等同于 <bean id="s" class="com.xyr.demo01.Student"/>

5. 创建Spring的主配置文件,声明组件扫描器的标签,指明注解在你项目中的位置.配置文件代码如下所示:

<?xmlversion="1.0"encoding="UTF-8"?><beans xmlns=";xmlns:xsi="; xmlns:context="; xsi:schemaLocation="   ;> <context:component-scan base-package="com.xyr"/></beans>

<context:component-scan/>标签解释:

<context:component-scan/>用于声明组件扫描器,组件就是Java对象,用于扫描指定包和子包中所有的Java类.

base-package属性: 指定注解所在项目中的包名

component-scan工作原理: Spring会解析主配置文件中的context:component-scan标签,读取base-package属性,根据该属性的值去扫描对应的包以及该包下面所有的子包下面的所有类,找到对应类中的注解,按照注解的功能创建对象或者给对象赋值.

注意: 当我们加入了component-scan标签,配置文件会自动导入一个新的约束文件spring-context.xsd,并且给这个新的约束文件起一个命名空间的名称.

Spring扫描对应包的注解创建Student对象,创建Spring容器获取对象.测试代码如下所示:

package com.xyr;import static org.junit.Assert.assertTrue;import com.xyr.demo01.Student;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestDIByAnnotation {@Test public void test01() {ApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml");Student s = ctx.getBean("s", Student.class);System.out.println(s);}}

运行结果如下所示:

总结:

这里对象的属性为null,原因在于我们注解的方式创建对象也是调用Student类的无参构造方法,并没有给属性赋值.

2. 这里我们学习了一个@Component注解,该注解一共有三种用法

方式一: @Component(value="s") 通过value指定对象的名称

方式二: @Component("s") value属性的值可以省略

方式三: @Component 不指定对象的名称,由Spring提供默认的名称,这个时候的名称就是类名的首字母小写,即student

3. 其实Spring还提供了另外三个注解,在功能上和@Component注解完全一致,分别是:

@Repository(用在持久层类的上面): 放在dao的实现类上面,表示创建dao对象,dao对象是能访问数据库的。

@Service(用在业务层类的上面):放在service的实现类上面,创建service对象,service对象是做业务处理,可以有事务等功能的。

@Controller(用在控制器的上面):放在控制器(处理器)类的上面,创建控制器对象的,控制器对象,能够接受用户提交的参数,显示请求的处理结果。

以上三个注解的使用语法和@Component一样的。 都能创建对象,但是这三个注解还有额外的功能。@Repository,@Service,@Controller是给项目的对象分层的。

4.我们也可以通过如下三种方式指定扫描多个包

<!--指定多个包的三种方式--><!--第一种方式:使用多次组件扫描器,指定不同的包--><context:component-scan base-package="com.xyr.demo01"/><context:component-scan base-package="com.xyr.demo02"/><!--第二种方式:使用分隔符(;或,)分隔多个包名--><context:component-scan base-package="com.xyr.demo01;com.xyr.demo02" /><!--第三种方式:指定父包--><context:component-scan base-package="com.xyr" />

注意: 不建议直接写扫描的包名为com,因为包扫描本质上就是IO扫描文件夹,如果直接写根包,那么扫描的时间长,导致运行效率降低.

标签: #java获取对象属性