注解(Annotation)是一种在 Java 程序中以元数据的形式对代码进行标记和说明的机制。它可以被添加到类、方法、字段、参数等程序元素上,用于提供额外的信息和指示。
也就是说注解是一种标记
通过扫描的方式生效,spring容器进行指定包下的文件扫描,然后根据注解进行后续操作
简单来说内置注解就是 Java语言提供的一些注解,不需要导依赖和导包使用。元注解也就是注解的注解 专门用来标注注解,自定义注解 ,开法者根据需要自定义自己的注解,也就是自己做的一些规定,通常需要导包进行使用。
<context:component-scan base-package="包名"/>
<context:exclude-filter type="annotion" expression="类的全限定符"/>
<context:include-filter type="annotion" expression="类的全限定符"/>
type="annotation"
表示使用注解作为过滤器的类型,它会匹配带有特定注解的类进行组件扫描。
作用域指的是在Spring容器中管理的Bean对象的生命周期范围和可见性。不同的作用域决定了在容器中创建的Bean实例的行为方式。
可以使用注解的形式进行规定
周期(Lifecycle)指的是对象的创建、初始化、使用和销毁过程中的各个阶段。在Spring框架中,可以通过声明周期方法注解来定义在Bean的生命周期中执行的特定方法。
它是spring框架的注解,用于自动装配bean,使用Autowired注解可以简化依赖注入。当创建一个Bean时,会自动检测该Bean所需要的依赖,将其注入到Bean中
public class MyBean {
private DependencyBean dependency;
@Autowired
public MyBean(DependencyBean dependency) {
this.dependency = dependency;
}
}
在上述示例中,MyBean 类的构造方法使用了 @Autowired 注解,告诉 Spring 自动注入 DependencyBean 对象。 自动注入也就是说会创建这个实例
public class MyBean {
@Autowired
private DependencyBean dependency;
}
public class MyBean {
private DependencyBean dependency;
@Autowired
public void setDependency(DependencyBean dependency) {
this.dependency = dependency;
}
}
public class MyBean {
private DependencyBean dependency;
@Autowired
public void injectDependency(DependencyBean dependency) {
this.dependency = dependency;
}
}
在上述示例中,MyBean 类的 injectDependency() 方法使用了 @Autowired 注解,告诉 Spring 自动注入与 DependencyBean 类型匹配的 Bean 对象。
我们来学习一下上面这部分内容的实际用处,以及为什么这样做
@Component
public class DependencyBean {
private String name;
private Integer age;
private String address;
@Override
public String toString() {
return "DependencyBean{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
使用Autowired注解进行注入
@Component
public class MyBean {
private DependencyBean dependency;
@Autowired //TODO 这个用法是什么呢?
public MyBean(DependencyBean dependency) {
this.dependency = dependency;
}
public String sing(){
dependency.setAddress("地球");
dependency.setAge(50);
dependency.setName("张三");
return dependency.toString();
}
}
注入之后进行使用
class Test{
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-ioc.xml");
MyBean bean = applicationContext.getBean(MyBean.class);
System.out.println(bean);
System.out.println(bean.sing());
}
}
结果:我可以不用创建这个注入的类的对象,使用Autowired会自动帮助我创建
2. 成员变量的注入:其余不改,仅更改MyBean内容
@Component
public class MyBean {
@Autowired
private DependencyBean dependency;
public String sing(){
dependency.setAddress("地球");
dependency.setAge(50);
dependency.setName("张三");
return dependency.toString();
}
}
我们执行之后得到的结果,可以发现注入的话会自动创建一系列内容。相当于得到了实例
@Component
public class MyBean {
private DependencyBean dependency;
@Autowired
public void setDependency(DependencyBean dependency) {
this.dependency = dependency;
}
public String sing(){
dependency.setAddress("地球");
dependency.setAge(50);
dependency.setName("张三");
return dependency.toString();
}
}
@Component
public class MyBean {
private DependencyBean dependency;
@Autowired
public void injectDependency(DependencyBean dependency) {
this.dependency = dependency;
}
public String sing() {
dependency.setAddress("地球");
dependency.setAge(50);
dependency.setName("张三");
return dependency.toString();
}
}
结果仍一样
我们需要明白Autowired会根据你规定或者是表明的内容进行注入,从而得到对应的bean对象或者是bean实例。这样做的话简化了操作,让我们实现起来更加的方便。
package com.dao;
import com.pojo.Student;
import java.util.List;
public interface StudentDao {
List<Student> queryAll();
}
package com.dao;
import com.pojo.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class StudentDaoImpl implements StudentDao{
// 这个位置不可以直接使用注解 需要使用的时 bean的依赖注入
@Autowired
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public List<Student> queryAll() {
String sql = "select * from students ";
List<Student> students = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Student.class));
return students;
}
}
这里我们主要明确,由于JdbcTemplate这个内容并不是我们创建的,这是根据需求导入的jar包,我们并不清楚它的标注是什么,这里仍然需要配置bean,先创建druid 进行配置后,注入依赖到JdbcTemplate中
<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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com"/>
<context:property-placeholder location="classpath:jdbcTemplate.properties"/>
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="${atguigu.url}">property>
<property name="password" value="${atguigu.password}">property>
<property name="driverClassName" value="${atguigu.driver}">property>
<property name="username" value="${atguigu.username}">property>
bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="druidDataSource"/>
bean>
beans>
这样的话,我们先配置号bean对象,当spring扫描的时候,扫描到Autowired的时候,会自动装配。只要保证bean的填写正确,后续的实例spring会帮助进行
package com.service;
import com.pojo.Student;
import java.util.List;
public interface StudentService {
List<Student> queryAll();
}
package com.service.impl;
import com.dao.StudentDaoImpl;
import com.pojo.Student;
import com.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class StudentsServiceImpl implements StudentService {
@Autowired
private StudentDaoImpl studentDao;
@Override
public List<Student> queryAll() {
List<Student> students= studentDao.queryAll();
System.out.println("service层的内容"+students);
return students;
}
}
package com.Constroller;
import com.pojo.Student;
import com.service.impl.StudentsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import java.util.List;
@Controller
public class StudentsConstroller {
@Autowired
private StudentsServiceImpl studentsService;
public List<Student> findAll(){
List<Student> student = studentsService.queryAll();
return student;
}
}
代码书写完毕之后,我们需要配置扫描,否则,spring的注解就没有任何效果了。先扫描才可以创建,不扫描的话出现这个错误
<context:component-scan base-package="加注解的包名"/>
public class TestIoc {
@Test
void testIoc(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
StudentsConstroller bean = applicationContext.getBean(StudentsConstroller.class);
List<Student> studentList = bean.findAll();
System.out.println(studentList);
}
}
仍然是老套路,先创建根据配置文件创建ioc容器,创建完成之后,扫描注解进行bean对象的实例,然后执行对应的内容。
通过Autowired进行关联,我们可以将依赖看成不同的模块,A模块调用B怎么调用?,那就是创建B模块的实例,在A中进行使用,而在这个位置,我们是通过注解的形式进行注入,相当于注解的效果是实现B模块的实例
使用ioc容器获取控制层对象,使用控制层的对象执行后续的内容。
前面我们提到的bean对象的配置,哪里使用的注入是通过指定property的ref进行关联的
如有错误,请指正。本文的内容来源于尚硅谷2023年ssm视频教程,对文中的内容有进一步补充和讲解。