Spring笔记(5) - 注解编程入门

Spring笔记五 - 注解编程入门

作者: Wyt


系列文章目录

Spring笔记(1) - 工厂
Spring笔记(2) - AOP编程
Spring笔记(3) - 持久层整合
Spring笔记(4) - MVC框架整合
Spring笔记(5) - 注解编程入门
Spring笔记(6) - 注解编程基础

1. 注解基础概念

1.1 什么是注解编程

//概念: 指的是在类或者方法上加入特定的注解(@  ),完成特定功能的开发

@Component
public class xxx{}

1.2 注解编程的优势

1. 注解开发方便
	代码整洁
	开发速度大大提高
2. Spring开发潮流
	Spring2.x引入注解
	Spring3.x完善注解
	Springboot普及 推广注解编程

1.3 注解的作用

1. 替换XML这种配置形式,简化配置

2. 替换接口,实现调用双方的契约性
	通过注解的方式,在功能调用者和功能提供者之间达成协定,进而进行功能的调用。因为注解应用更为方便灵活,所以在现在的开发中,更推荐通过注解的形式完成

1.4 Spring注解的发展历程

1. Spring2.x开始支持注解编程 如Component @Service @Scope ...
	目的:提供的这些注解只是为了在某些情况下简化XML配置,作为XML开发的有益补充
2. Spring3.x   @Configuration @Bean ...
	目的:彻底替换XML,基于纯注解编程
3. Spring4.x  衍生出SpringBoot框架
	提倡使用注解进行常见开发
4. Spring5.x 
	变化不大,依然是提倡注解的开发

1.5 Spring注释开发的一个问题

  • Spring基于注释进行配置后,还能否解耦合呢
* 在Spring框架应用注解时,如果对注解配置的内容不满意,可以通过Spring配置文件进行覆盖

2. Spring的基础注解 (Spring2.x)

* 这个阶段的注解,仅仅是简化XML的配置,并不能完全替代XML

2.1 对象创建相关注解

2.1.1 搭建开发环境
<context:component-scan base-package="包名"/>
* 作用:
	让Spring框架在设置包及其子包扫描对应的注解,使其生效
2.1.2 对象创建相关注解
2.1.2.1 @Component
	作用:替换原有spring配置文件中的 bean 标签
	注意:
		id属性 component注解 提供了默认的设置方式 id首字母为小写
		class属性 通过反射获得class内容
	细节:
		(1)指定工厂创建对象的id值
			@Component("id值")
		(2)Spring配置文件覆盖注解配置内容
			注意:id值和class值要和注解中的设置保持一致
			具体操作:
				<bean id = "" class="">
					<property .../>
				</bean>
2.1.2.2 @Component的衍生注解
1. Repository      DAO
2. Service         Service
3. Controller      Controller
	
	注意:
		(1)本质上这些衍生注解就是@component,他们的作用、细节和用法都是完全一致的。
		(2)在Spring整合MyBatis开发过程中,不使用@REpository, @Component
	目的:更加准确地表达一个类型的作用
	
2.1.2.3 @Scope注解
	作用:控制简单对象的创建次数
	代替 <bean id="" class="" scope="singleton|prototype"/>
	
	注意:不添加@Scope时,Spring提供默认值 singleton
2.1.2.4 @Lazy注解
	作用:延迟创建单实例对象
	说明:对于单实例对象,Spring默认会在工厂创建的同时创建该对象
	一旦使用了@Lazy注解后,Spring会在使用这个对象的时候,进行对这个对象的创建
	替代 <bean id="" class="" lazy-init="true"/>
2.1.2.5 生命周期方法相关注解
1. 初始化相关方法
	@PostConstruct
	InitializingBean
	替代 <bean init-method=""/>
	
2. 销毁方法
	@PreDestroy
	DisposableBean
	替代 <bean destroy-method=""/>
	
注意:
	1. 上述的两个注解并不是Spring提供的,是JSR(JavaEE规范)520提供的
	2. Spring兼容了JSR
	3. 再一次的验证,通过注解实现了接口的契约型
2.1.3 注入相关注解
2.1.3.1 用户自定义类型 @Autowired
	功能:对类成员变量、方法及构造函数进行标注,完成自动装配的工作
	替代 <property name="" value=""/>
  • UserDAOImpl.java
@Repository
public class UserDAOImpl implements UserDAO {
    @Override
    public void save() {
        System.out.println("UserDAOImpl.save");
    }
}
  • UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
    private UserDAO userDAO;

    public UserDAO gerUserDAO() {
        return this.userDAO;
    }

    @Autowired
    public void setUserDAO(UserDAO userDAO) {
        System.out.println("UserServiceImpl.setUserDAO");
        this.userDAO = userDAO;
    }

    @Override
    public void register() {
        this.userDAO.save();
    }
}
  • 测试方法
	/**
     * 用于测试:@Autowired注释
     */
    @Test
    public void test03() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");

        UserService userServiceImpl = (UserService) ctx.getBean("userServiceImpl");
        userServiceImpl.register();
    }
  • 运行结果
UserServiceImpl.setUserDAO
UserDAOImpl.save
@Autowired细节
	@Autowired细节

1. Autowired注解基于类型进行注入 [推荐]
   基于类型的注入:注入对象的类型,必须与目标成员变量类型相同或者是其子类(实现类)

2. Autowired Qualifier 基于名字进行注入 [了解]
   基于名字的注入:注入对象的id值,必须与Qualifier注解中设置的名字相同

3. Autowired注解放置位置 
    a) 放置在对应成员变量的set方法上 
    b) 直接把这个注解放置在成员变量之上,Spring通过反射直接对成员变量进行注入(赋值)[推荐]
    	如:
    	@Autowired
    	@Qualifier("userDAOImpl")
    	private UserDAO userDAO;

4. JavaEE规范中类似功能的注解
    JSR250 @Resouce(name="userDAOImpl") 基于名字进行注入
    	替代:
           @Autowired()
           @Qualifier("userDAOImpl")
           注意:如果在应用Resource注解时,名字没有配对成功,那么他会继续按照类型进行注入。
           
    JSR330 @Inject 作用 @Autowired完全一致 基于类型进行注
    	主要应用在EJB3.0中,在Spring中应用很少,了解即可
          <dependency>
          	<groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
          </dependency>
2.1.3.2 JDK类型
@Value注解完成
1. 设置xxx.properties 
   id = 10
   name = Jordan
2. Spring的工厂读取这个配置文件 
   <context:property-placeholder location=""/>
3. 代码 
   属性 @Value("${key}")
   
       @Value("${id}")
        private Integer id;

        @Value("${name}")
        private String name;
@PropertySource注解
1. 作用:用于替换Spring配置文件中的<context:property-placeholder location=""/>标签

2. 开发步骤 
    1. 设置 xxx.properties 
       id = 10
       name = suns
    2. 应用 
    	@Component
        @PropertySource("classpath:/xxx.properties")
        public class XXX{}
    	
    3. 代码
       属性 @Value()
@Value注解使用细节
  • 不能使用在静态成员变量上,否则会出现赋值 (注入)失败的情况

  • @Value注解+Properties这种方式,不能注入集合类型

    * Spring提供新的配置形式 YAML YML
    	 	这种配置形式在SpringBoot被广泛使用
    
2.1.4 注入扫描详解
配置文件.xml中
	<context:component-scan base-package="包名"/>
	
	范围:当前包 及其 子包
2.1.4.1 排除方式
<!--注意:排除策略可以叠加使用-->
<context:component-scan base-package="">
    <context-exclude-filter type="" expression=""/>
    <context-exclude-filter type="" expression=""/>
    <context-exclude-filter type="" expression=""/>
</context:component-scan>
	type:
			(1)assignable   排除指定的类型,不进行扫描
						<context-exclude-filter type="assignable" expression="com.wyt.bean.User"/>

			(2)annotation  排除指定的注解,不进行扫描
						<context-exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>

			(3)aspectj     (方便) 切入点表达式
						包切入点:com.wyt.bean..*
						类切入点:*..User

			(4)regex		正则表达式
			(5)custom		自定义排除策略,一般用于框架底层的开发
2.1.4.2 包含方式
<context:component-scan base-package="" use-default-filters="false">
    <context-include-filter type="" expression=""/>
</context:component-scan>
详解:
	1. use-default-filters="false"
		作用:让Spring默认的注解扫描方式失效
	
	2. <context-include-filter type="" expression=""/>
		作用:指定扫描哪些注释
		type:
			(1)assignable   包含指定的类型,进行扫描
						<context-include-filter type="assignable" expression="com.wyt.bean.User"/>

			(2)annotation  包含指定的注解,进行扫描
						<context-include-filter type="annotation" expression="org.springframework.stereotype.Service"/>

			(3)aspectj     (方便) 切入点表达式
						包切入点:com.wyt.bean..*
						类切入点:*..User

			(4)regex		正则表达式
			(5)custom		自定义包含策略,一般用于框架底层的开发
		
2.1.5 对于注解开发的思考
  • 配置互通
* Spring注解配置和配置文件的配置可以互通

	@Repository
    public class UserDAOImpl{
    }

    public class UserServiceImpl{
       private UserDAO userDAO;
       set get
    }

    <bean id="userService" class="com.wyt.UserServiceImpl">
       <property name="userDAO" ref="userDAOImpl"/>
    </bean>
  • 什么情况下使用注解 什么情况下使用配置文件
	基础注解(@Component @Autowired @Value) 程序员开发类型的配置

1. 在程序员开发的类型上 可以加入对应注解 进行对象的创建 
	如:User  UserService  UserDAO  UserAction 

2. 应用其他非程序员开发的类型时,还是需要使用 bean标签 进行配置的
	如:SqlSessionFactoryBean  MapperScannerConfigure 
2.1.6 SSM整合开发(半注解开发)(了解)
2.1.6.1 搭建开发环境
  • 引入相关jar 【SSM POM】
  • 引入相关配置文件
    • applicationContext.xml
    • struts.xml
    • log4.properties
    • XXXMapper.xml
  • 初始化配置
    • Web.xml Spring (ContextLoaderListener)
    • Web.xml Struts Filter
2.1.6.2 编码
<context:component-scan base-package=""/>
  • DAO (Spring+Mybatis)

    1. 配置文件的配置
       1. DataSource
       2. SqlSessionFactory -> SqlSessionFactoryBean
          1. dataSource
          2. typeAliasesPackage
          3. mapperLocations 
       3. MapperScannerConfigur -> DAO接口实现类
    2. 编码
       1. entity 
       2. table
       3. DAO接口
       4. 实现Mapper文件
    
  • Service

    1. 原始对象 --> 注入DAO
       @Service -> @Autowired
    
    2. 额外功能 --> DataSourceTransactionManager --> dataSource
    3. 切入点 + 事务属性
       @Transactional(propagation,readOnly...)
    4. 组装切面
       <tx:annotation-driven 
    
  • Controller (Spring+Struts2)

    1. @Controller
       @Scope("prototype")
       public class RegAction implements Action{
          @Autowired
          private UserService userServiceImpl;
       
       }
    2. struts.xml
        <action class="spring配置文件中action对应的id值"/>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quantum_Wu

一起加油呀ヾ(◍°∇°◍)ノ゙

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值