Spring 基于纯注解方式的使用

注解和xml混合开发遗留问题
想一想能不能将以下这些bean的配置都从xml中去掉,并且最终将xml也去掉。如果可以,那我们就可以脱离xml配置了。

  • 注解扫描配置(能不能去掉)
<!--开启注解并扫描指定包中带有注解的类-->
<context:component-scan base-package="com.kkb.spring.service"/>
<context:property-placeholder src=""></context:property-placeholder>
  • 非自定义的bean配置(比如:SqlSessionFactory和BasicDataSource配置)
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlsessionFactoryBean">
	<property name="dataSource" value=“dataSource”></property>
</bean>
  • 去掉xml后,如何创建ApplicationContext
    之前创建ApplicatioContext否是通过读取xml文件进行创建的。
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");

@Configuration
相当于spring的xml配置文件
从spring3.0开始可以使用@Configuration定义配置类,可以替换xml配置文件
配置类内部包含有一个或多个被@Bean注解的方法,这些方法会将会被AnnotationConfigApplicationContext或者AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义对象,初始化Spring容器。

  • 属性:
    value:用于指定配置类的字节码

  • 示例代码:

@Configuration
public class SpringConfiguration{
	//spring容器初始化时,会调用配置类的无参构造函数
	public SpringConfiguration(){
		System.out.println("容器初始化。。。");
	}
}

@Bean
相当于标签
作用为:注册bean对象,主要用来配置非自定义的bean,比如DriDridDataSource、SqlSessionFactory
@Bean标注在方法上面(返回某个实例的方法)

  • 属性:
    name:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。如果不指定,默认与标注的方法名称相同。
    @Bean注解默认作用域为单例singleton作用域,可通过@scope(“prototype”)设置为原型作用域。

  • 示例代码:

@Configuration
public class SpringConfiguration{
	//spring容器初始化时,会调用配置类的无参构造函数
	public SpringConfiguration(){
		System.out.println("容器初始化。。。");
	}
	
	@Bean
	@Scope("prototype")
	public SQLSessionFactory userService(){
		SQLSessionFactory sqlSessionFactory=new DefaultSqlSessionFactory();
		sqlSessionFactory.setxxx();
		return 	sqlSessionFactory;
	}
}

@ComponentScan
相当于context:component-scan标签
组件扫描器,扫描@Component、@Controller、@Service、@Repository注解的类。
该注解是编写在类上面的,一般配合@Configuration注解一起使用。

  • 属性:
    basePackages:用于指定要扫描的包。
    value:和basePackages作用一样。
  • 示例代码
    Bean类(Service类):
@Service
public class	UserServiceImpl implements UserService{
	@Override
	public void saveUser(){
		System.out.println("保存用户 Service实现类");
	}
}

配置类:

@Configuration
@ComponentScan(basePackages="com.sping.service"public class SpringConfiguration{
	public SpringConfiguration(){
		System.out.println("容器初始化。。。")
	}
}

@PropertySource
相当于context:property-placeholder标签
编写在类上面,作用是加载properties配置文件

  • 属性
    value[]:用于指定properties文件路径,如果类路径下,需要写上classpath
  • 示例代码
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig{
	@Value("${jdbc.driver}")
	private String driver;
	@Value("${jdbc.url}")
	private String url;
	@Value("${jdbc.username}")
	private String username;
	@Value("${jdbc.password}")
	private String password;
	
	/**
	*创建一个数据源,并存入spring容器中
	*@return	
	*/
	@Bean(name="dataSource")
	public DataSource createDataSource(){
		try{
			ComboPooledDataSource ds=new ComboPooledDataSource();
			ds.setDriverClass(driver);
			ds.setJdbcUrl(url);
			ds.setUser(username);
			ds.setPassword(password);
			return ds;
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	}
}

properties文件:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///spring
jdbc.username=root
jdbc.password=root

@Import
相当于spring配置文件中的标签
用来组合多个配置类,在引入其他配置类,可以不再用@Configuration注解,当然写上也没问题

  • 属性
    value:用来指定其他配置类的字节码文件

  • 实例代码:

@Configuration
@ComponentScan(basepackages="com.spring"@Import({jdbcConfig.class})
public class SpringConfiguration{
}

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig{
}

创建纯注解方式上下文容器

  • java应用(ApplicationConfigApplicationContext)
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService=context.getBean(UserService.class);
userService.saveUser();
  • web应用(AnnotationConfigApplicationContext)
<web-app>
	<context-param>
    <param-name>contextClass</param-name>
    <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext	
    </param-value>
  </context-param>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      com.spring.test.SpringConfiguration	
    </param-value>
  </context-param>
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
</web-app>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring Framework,需要在项目的pom.xml文件中引入以下坐标: ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> ``` 其中`${spring.version}`是Spring框架的版本号。 Spring的IOC(Inverse of Control)实现原理是通过BeanFactory和ApplicationContext两个核心接口实现的。BeanFactory是Spring的核心接口,用于管理对象的创建及依赖关系的维护。ApplicationContext是BeanFactory的一个扩展,提供了更多的功能,如事件传播、国际化、资源载入等。 Spring的AOP(Aspect Oriented Programming)实现原理是基于代理模式的。Spring AOP采用动态代理技术,对目标对象进行增强,实现横切关注点的统一处理。具体实现方式可以是JDK动态代理或CGLIB动态代理。 Spring的IOC和AOP可以解决软件开发过程中的诸多问题。IOC通过将对象的创建及依赖关系的维护交给Spring容器,降低了组件之间的耦合度,提高了代码的可维护性和可扩展性。AOP通过对横切关注点的统一处理,减少了重复代码的出现,提高了代码的复用性和可读性。 使用Spring注解方式,可以通过以下步骤实现: 1. 在配置类上添加`@Configuration`注解,表示该类为Spring的配置类。 2. 在配置类上添加`@ComponentScan`注解,指定需要扫描的包路径。 3. 在需要注入的对象上添加`@Component`注解,表示该类为Spring的组件。 4. 在需要注入的属性上添加`@Autowired`注解,表示该属性需要自动注入。 例如,以下代码演示了如何通过注解方式实现一个简单的UserService类: ```java @Component public class UserService { @Autowired private UserDao userDao; //... } @Configuration @ComponentScan(basePackages = "com.example") public class AppConfig { //... } public class UserDao { //... } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值