欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > spring day1023

spring day1023

2024/10/27 14:08:09 来源:https://blog.csdn.net/2201_75555400/article/details/143191401  浏览:    关键词:spring day1023

ok了家人们,今天继续学习spring框架,

.Spring的注解开发

在开发中,配置文件中 Bean 标签会非常多,难以维护。怎么
办?
使用注解的形式替代 xml 配置,可以将一些繁杂的 spring 配置
从工程中消除掉,简化书写。
注解配置和基于 XML 配置内容含义是一模一样,可以互相置
换。
实际开发中,到底用 xml 还是注解,各有优劣,所以这两种
配置方式我们都需要掌握。尤其是注解,在未来的
SpringBoot 中有很重要的应用。现在需要好好掌握

7.1 xml半注解开发

7.1.1 启用注解功能
  • 启动注解扫描
<context:component-scan basepackage="packageName"/>
  • 说明:
        在进行包所扫描时,会对配置的包及其子包中所有java
        文件进行扫描
        扫描结束后会将可识别的有效注解转化为spring 对应的
        资源加入IoC 容器
  • 示例
<context:component-scan base-package="com.cjx"/>

7.1.2 Bean的定义(@Component)

  • 名称: @Component @Controller @Service
    @Repository
  • 类型:类注解
  • 位置:类定义上方
  • 作用:设置该类为spring管理的bean
  • 示例:
//@Component
@Service
public class UserServiceImpl implements
UserService{
@Override
public void save() {
System.out.println("service...add...");
}
}
  • 说明:
    • @Controller@Service @Repository
    • @Component的衍生注解,功能同@Component
    • @Controller 用于Controller层的类 :表现层
    • @Service 用于Service层的类: 业务层
    • @Repository 用于Dao层的类: 持久层(一般不写)
  • 相关属性: value (默认),定义 bean 的访问 id 。默认的 id
    名称为 " 简单类名,首字母小写 "
    • 使用 value 属性指定 bean id
@Service(value = "userService")
public class UserServiceImpl implements
UserService{
@Override
public void save() {
System.out.println("service...add...");
}
}

 

  • 当注解中只设置一个属性时,value属性的属性名可以省略:
@Service("userService")
public class UserServiceImpl implements
UserService{
@Override
public void save() {
System.out.println("service...add...");
}
}
注意:
7.1.3 注入Bean(@Autowired)
  • 注解的方式注入bean,不需要setter方法
  • 名称:@Autowired@Qualifier@Resource
  • 类型:属性注解、方法注解(了解即可)
  • 位置:可以用在属性上和set方法上, 如果写在属性上,可
  • 以没有set方法
  • 作用:自动装配,设置属性的对象或对方法进行传参(从
  • IOC容器查找对象, 给属性赋值)
  • 示例:
@Service
public class UserServiceImpl implements
UserService{
@Autowired
private UserDao userDao;
@Override
public void save() {
System.out.println("service...add...");
}
}
  • 说明:
    • @Autowired 按类型装配,一般生产中都使用它 ,
      spring 提供的,只有引入 spring 依赖才可使用。
    • @Qualifier 可以指定bean的id,一般用于有多个同一
      类型 bean 的场景 ( 必须配合 @Autowired 使用 )
    • @Resource 相当于同时指定了@Autowired和
      @Qualifier ,由 Jdk 提供的,了解即可。
@Service
public class UserServiceImpl implements
UserService{
@Autowired
@Qualifier("userDao")
private UserDao userDao;
@Override
public void save() {
System.out.println("service...add...");
}
}
  •  相关属性
    • @Autowired
      • required:定义该属性是否允许为null,默认true
    • @Qualifier
      • value:需要注入的beanid
    • @Resource
      • name :需要注入的 bean id
7.1.4 其他注解(了解即可)
  • @Primary 类注解(也可以用于方法上,配合@Bean使用),设置bean的优先级
    • @Autowired 默认按类型装配,当出现相同类型的
      bean ,使用 @Primary 提高按类型自动装配的优先级,
      程序就不会报错了。
@Primary
@Component
public class ClassName{}
  • @Scope 类注解,设置该类作为bean对应的scope属性
    • 相当于标签的scope属性
// 默认为singleton
@Scope("prototype")
public class ClassName{}

7.2 Spring纯注解开发

spring 零配置也就是使用注解完全替代 xml 配置文件。
零配置 xml 就不要了,那么有谁来进行 xml 的替代 ? 如何实
现?
替代 xml 中相关标签的注解是什么?怎么使用?
既然没有 xml 了,还得创建一个 用来解析注解的容器对象,如
何创建?
7.2.1 零配置IOC容器
加载纯注解格式上下文对象,需要使用AnnotationConfigApplicationContext
// SpringConfig是一个配置类(有@Configuration注解)
ApplicationContext ctx = new
AnnotationConfigApplicationContext(SpringConfig.
class);
7.2.2 @Configuration注解
  • 类型:类注解
  • 作用:作用等同于 xml 配置文件,当前注解声明的类中,编
    写配置信息,所以我们把 使用 @Configuration 的类称之
    为配置类
  • 实例
//标注当前类是配置类,替代applicationContext.xml
@Configuration
public class MyConfiguration {
}
 7.2.3 @ComponentScan注解
  • 类型:类注解
  • 作用:扫描注解,此注解只能添加一次,多个数据请用数组格式
  • 实例
@Configuration
@ComponentScan({"com.lzw"})
//@ComponentScan({"com.lzw.service","com.lzw.dao
"})
public class SpringConfig {……}
  • 相当于XML配置文件中的context:component-scan标签
<context:component-scan base-package="com.lzw"/>
  •  注意:扫描的包路径不写,扫描当前包及其子包!

7.3 Spring整合Druid

7.3.1 @Bean注解
  • 类型:方法注解
  • 作用:将方法的返回值存储到Spring IOC容器中
  • 实例
//第三方jar包的类,添加到ioc容器,无法使用
@Component等相关注解!
//bean的id可以指定,默认是方法名
@Bean("dataSource")
public DruidDataSource createDataSource(){
//创建数据源对象并返回
DruidDataSource druidDataSource = new
DruidDataSource();
druidDataSource.setDriverClassName(driverClassN
ame);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
  • 相当于XML配置文件中的标签
<bean id="userService"
class="com.lzw.service.UserServiceImpl"></bean>
7.3.2 @Value注解
  • 类型:属性注解、方法注解(了解)
  • 作用:注入非引用类型,设置属性的值或对方法进行传参
  • 范例:
@Value("${jdbc.driver}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
  • 说明:
    • @value 一般用于读取 properties 文件中的属性值
    • 注解的方式注入非引用类型,不需要 setter 方法
  • 相关属性
    • value (默认):定义对应的属性值或参数值
7.3.3 @Import注解
  • 类型:类注解
  • 作用:导入其他配置类(对象)
  • 范例
//RedisConfig是另外一个配置类
@Import({RedisConfig.class})
public class SpringConfig{
}
  •  相当于XML配置文件中的标签
<import resource="classpath:applicationContext-dao.xml"/>
7.3.4 @PropertySource注解
  • 位置:标记在类上
  • 注解作用:引入外部属性文件 (jdbc.properties) ,加载多文
    件请使用数组格式配置
  • 实例:
//@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})
@PropertySource({"classpath:db.properties"})
public class JdbcConfig {
}

 

  • 相当于XML配置文件中的context:property-placeholder标签
<context:property-placeholder location="classpath:db.properties"/>

7.4 Spring整合JUnit

7.4.1 Spring整合junit的好处
  • 好处一:配置完之后,不需要我们手动创建 Spring 的容
    器,容器由 Junit 帮我们自动初始化
  • 好处二:可以在 junit 测试类中使用 @AutoWired 等方式注
    入对象,直接对其进行调用测试
7.4.2 整合实现步骤
  • 导入依赖坐标
  • 在测试类上加入@RunWith注解,指定Spring的运行器
  • 配置初始化Spring容器的配置文件(配置类)
  • 删除原有的初始化代码ClassPathXmlApplicationContext
  • 注入Bean,执行测试代码
  • 导入依赖坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
注意: junit 的依赖至少要是 4.12 版本 , 可以是 4.13 等版本 , 否则
会出现异常
  • 代码实现
//在测试类上加入@RunWith注解,指定Spring的运行器
@RunWith(SpringJUnit4ClassRunner.class)
//配置初始化Spring容器的配置文件(配置类)
@ContextConfiguration(classes =
{SpringConfig.class}) //加载配置类
业务层代码
//@ContextConfiguration(locations=
{"classpath:applicationContext.xml"})//加载配置文
件
public class DemoTest {
@Autowired
private UserService userService;
@Test
public void test01(){
userService.save();
}
}

7.5 参考代码

  • 业务层代码
public interface UserService {
public void save();
}
@Service
public class UserServiceImpl implements
UserService{
@Autowired
private UserDao userDao;@Override
public void save() {
System.out.println("service...add...");
userDao.save();
}
}
  • DAO层代码
public interface UserDao {
public void save();
}
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void save() {
System.out.println("dao...save...");
}
}
  • 配置类
@Configuration
@ComponentScan({"com.lzw"})
@Import({JdbcConfig.class})
public class SpringConfig {
}
@PropertySource({"classpath:db.properties"})
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
// 如何完成把德鲁伊对象交给spring管理
@Bean
public DruidDataSource createDataSource(){
//创建数据源对象并返回
DruidDataSource druidDataSource = new
DruidDataSource();
druidDataSource.setDriverClassName(driverClassNa
me);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
  • 测试
//在测试类上加入@RunWith注解,指定Spring的运行器
@RunWith(SpringJUnit4ClassRunner.class)
//配置初始化Spring容器的配置文件(配置类)
@ContextConfiguration(classes =
{SpringConfig.class}) //加载配置类
//@ContextConfiguration(locations=
{"classpath:applicationContext.xml"})//加载配置文件
public class DemoTest {
@Autowired
private UserService userService;
@Autowired
private DataSource dataSource;
@Test
public void test01(){
userService.save();
System.out.println(dataSource);
}
}

ok啊,明天见,特别是你吴彦祖

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com