注解开发形式
首先开启注解扫描
<!--
开启注解扫描 不同的spring版本,配置方式不同
component 元器件
scan 扫描
base-package 那个包 com.eas包下的类
-->
<context:component-scan base-package="com.eas"/>
在你想要使用的类上面进行书写 @Component
作用在类上的注解,可以使用此注解来描述Spring中的Bean,但是它是一个泛华的概念,仅仅表示一个组件,可以作用在任何层次。白话文描述:当某个类上用该注解修饰时,表示Spring 会把这个类扫描成一个Bean实例,等价于XML方式中定义的:<bean id="user" class="com.thr.spring.pojo.User">,此时可以直接简写成@Component(value = "user") 或者 @Component("user"),甚至直接写成@Component,如果不写括号里面的内容,默认以类名的首字母小写的形式作为 id 配置到容器中。
这四个注解功能一样的,都是代表将某个类注册到容器中
@Component 是一个通用的组件 有几个和它同样功能的注解,
@Controller、相当于controller层的
@Service、相当于service层的
@Repository 相当于dao层的
然后进行测试即可进行使用这个注解引用扫描
<!--spring 会找到这个xml文件,并找到这些bean 然后利用反射创建对象,spring还会帮我们管理这些对象-->
<bean id="dog1" class="com.east.pojo.Dog"/>
<!--这是注解的形式 但是你要注意你要创建的对象上面要加上@Compoent这个注解才能找到你要创建的实体对象, 还有就是你的id值不自定义的话就是你要创建的对象类的小写名,要不加写成@Compoent("定义的id值")-->
<context:component-scan base-package="com.east"/>
@Scope(''prototype'')这是进行测试这个是不是单例模式,写上这个注解就不是单例模式
创建的对象就不会相同,一般不进行修改
/**
* 配置版:
* <bean id="dog1"
* class="com.east.entity.Dog"
* scope="prototype
* init-method="aaa"
* destroy-method="bbb">
* <property name="name" value="nn"/>
* </bean>
*
* 注解版:
* class可以省略了(因为注解就在该类中,被自动扫描了)
* id,如果我们不管,默认就是 类名首字母小写
* 如果想自定义id值,就在@Component中进行设置:@Component("dog1")
* 此时id值就是dog1了
* 配置版中的 init-method属性,可以使用 @PostConstruct注解,放在方法上
*
* 关于scope:
* 如果是单例,归spring统一管理,包括创建和销毁
* 如果不是单例,销毁归jvm管
*
* 关于@Component
* 是一个通用的组件注解。
* 有几个和它同样功能的注解,@Controller、@Service、@Repository
*
* 如果想 setter注入 基本类型,可以使用@Value方式:@Value("nn")
* 如果想从properties文件中导入数据,@Value("${zy.url}")
*/
//@Scope("prototype") //如果这里不是单例,init方法每创建一个对象就调用一次
初始化
配置版中的 init-method属性,可以使用 @PostConstruct注解,放在方法上
销毁
配置版中的 destroy-method属性,可以使用 @PreDestroy注解,放在方法上
在一个类里面进行使用另一个类创建的对象,不用自己new了使用一个注解即可
@Autowired相当于下面的配置代码
<!--ref引用spring中已经创建很好的对象-->
<!--value是一个具体的值-->
<bean class="com.east.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"/></bean>
<!--bean = 对象-->
<!--id = 变量名-->
<!--class = new的对象-->
<!--property 相当于给对象中的属性设值-->
<bean id="userDao" class="com.east.service.impl.userDao></bean>
/**
* 我们在成员变量上使用@Autowired注解
* spring会去扫描这个成员变量类型,扫到的是接口,
* 就去找对应的实现类,然后就找到了UserDaoImpl
* 就将spring管理的UserDaoImpl单例 借给了service的成员变量userDao
*
* 自动装配的整套流程下来:
* spring帮我们管理了UserServiceImpl、UserDaoImpl
* 并且将UserDaoImpl 注入到 UserServiceImpl
* 自动装配,需要 Service层加@Service注解、Dao层也需要加@Repository注解
* 此时这两个类才能被spring管理,才能进行注入操作,即ref操作
* @Autowired
* 默认先按类型去找 byType
* 就会按id找 byName
*
* 如果有多个实现类,使用byType找不到,就要使用byName
* 1、方案一:
* private UserDao userDaoImpl02;//将这里改为 要使用的实现类 在spring中的id值
* 2、方案二:
* 还是写private UserDao userDao;
* 只是再添加一个@Qualifier注解,将id值写在这个注解中
*/
@Qualifier相当于多个类的一个命名
@Autowired
private UserDao userDaoImpl02
相等相等相等相等相等相等相等相等相等相等相等相等相等相等相等
@Autowired
@Qualifier("userDaoImpl02")
private UserDao userDao;
@Value相当于bean中的property
这个注解可以将你所需要的值进行添加 @Value("${zz.driverClassName}")
这是一种书写形式,将你的文件值进行注解添加不需要在spring中的bean中进行添加使用;了
记住将你的文件进行在配置文件中导入
全注解形式
@Configuration 标识你是配置类进行替代你的xml文件
具体就是配置文件中的<beans>标签。被@configuration标注的类,他里边所有的被@bean标注的方法都会被执行,这些方法返回的对象会注入到容器中,对象的id(bean id)就是方法名。@configuration用在类上方,声明这个类是一个spring配置类,执行的功能是代替spring的配置文件 ,也可以说,相当与sprig.xml中的<beans>标签
@bean用在方法上方,@bean一般与@configuration配合使用,用在@configuration类中的获取实例的方法上方。相当于spring.xml中的<bean>标签
添加@ComponentScan("com.east") 可以进行注解扫描
这个注解主要是标注需要扫描哪些包路径。该路径下标注了@service, @controller,@repository, @component的类,都将被注入到容器中。除了这四个标签,包路径下标注了@configuration类,也会被注入到容器中。
@import这个注解在老版本中,将他放在configuration类上的时候, 只能完成引入别的configuration类的功能。类似于容器xml配置文件的import标签。但是在新版本中,可以引入任何类,不一定是configuration类。这样就变得非常灵活。这里 的引入就是注入的意思。将该类注入到容器中,即使该类没有被注解@service, @controller,@repository, @component等所标注。
全注解:这是进行类文件连接的
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
这是进行xml文件进行连接的
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("cc.xml");
package com.east.config;
import com.easthome.entity.Cat;
import jdk.nashorn.internal.ir.ReturnNode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
/**
* MyConfig 就是 替换 我们cc.xml的东西
* 1、标注一下 它是配置类
* @Configuration
* 2、添加@ComponentScan("com.easthome") 可以进行注解扫描
*/
@Configuration
@ComponentScan("com.east")
@EnableAspectJAutoProxy
public class MyConfig {
/*
* 下面这个@Bean的方式,和注释上的<bean>标签是一个意思
* 有时我们想让spring管6理某个类,但这个类不是我们自己写的,我们加不上@Component,就可以使用@Bean方式
* <bean id="cat01" class="com.east.entity.Cat">
<property name="name" value="nn"/>
</bean>
* */
相等相等相等相等相等相等相等相等相等相等相等相等相等相等相等相等相等相等
@Bean
public Cat cat01(){
Cat cat = new Cat();
cat.setName("nn");
return cat;
}
}
spring和junit 合作实现 加入以下文件依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
添加这个注解
@RunWith(SpringJUnit4ClassRunner.class) //SpringJunit4ClassRunner log4j --> log for java
@ContextConfiguration(classes = MyConfig.class)