注解开发定义bean:@Controller:用于表现层bean定义;@Service:用于业务层bean定义;@Repository:用于数据层bean定义。
?我们先来完成数据层和业务逻辑层的注解
? ?数据层:
package org.example.dao.impl;
import org.example.dao.bookDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
//@Repository
@Repository("bookDao5")
// 写上@Repository就相当于注解该类为bean,括号中写的是该bean的id属性
//@Scope("prototype")
public class bookDaoImpl5 implements bookDao {
@Override
public void save() {
System.out.println("bookDao....");
}
}
@Repository后面括号中填的是bean标签时的id值,当该实现类只有这一个bean时可以省略括号只写@Repository。
@Scope("prototype") 设置创造出来的对象不是单例。不写的话,默认是单例。
? 业务层
package org.example.service.impl;
import org.example.dao.bookDao;
import org.example.service.bookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class bookServiceImpl5 implements bookService{
@Autowired
@Qualifier("bookDao5")
bookDao bookDao;
@Override
public void save() {
bookDao.save();
System.out.println("bookService....");
}
}
@Autowired :自动装配,写了该标签,就不用写set方法了,是基于反射创建对象并暴力反射。建议使用无参的构造方法
?@Qualifier("bookDao5"):如果依赖注入的bean有多个实现类,就采用按名称装配,然后加上该注解,括号中写的要进行配置的bean的名称,且该注解必须依赖上面那个@Autowire注解。
下面是对spring配置文件的处理:因为我们是纯注解开发,所以我们不要spring的配置文件,采用注解来设置。
? 先创建一个config包,建一个springConfig的类
然后为该类配置@Configuration注解,写上这个注解就相当于把spring配置文件中的框架写好了,剩下的就是去定义我们需要的bean了。
因为我们前面在写数据层和业务层代码时已经分别给他们配置了bean标识的注解,我们只需要把数据层和业务层的bean告诉该配置类就可以了。
这时候就需要@ComponentScan("")注解了,这个注解用于扫描配置了注解的类的标签,该注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式: ?({"","",""})
package org.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
//写完上面的这个注解,就相当于把bean配置文件中的框架写好了
//该注解用于设定当前类为配置类
@ComponentScan("org.example")
//写了上面俩个注解,我们就可以不用写bean配置文件了
@PropertySource("jdbc2.properties")//想添加多个配置资源,用数组格式: ({"","",""})。其中配置名不能用通配符*,可以加上classpath
public class springConfig {
}
@PropertySource(""),用于添加其他资源的配置文件。想添加多个配置资源,用数组格式: ({"","",""})。其中配置名不能用通配符*,可以加上classpath。
下面是怎么用注解管理数据库连接池:
?我们需要在config包下创建一个专门用于管理数据库连接的类:
package org.example.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.example.dao.bookDao;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class JdbcConfig {
//简单类型数据
@Value("com.mysql.cj.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/mysql")
private String url;
@Value("root")
private String username;
@Value("root")
private String password;
//定义一个方法来获取要管理的对象
@Bean
public DataSource dataSource(){
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
}
?为方法添加@Bean注解,表示把该方法的返回值作为bean。
我们通过简单类型数据的注入将与数据库连接需要的数据传入给数据库连接池。
想传入引用类型的话,可以把引用类型作为方法的形参传入:
@Bean("dataSource2")
public DataSource dataSource2(bookDao bookDao){
System.out.println(bookDao);
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
?
?
这样数据库连接方面做好了,但是我们需要让springConfig配置类知道我们做的这个与数据库的连接,我们可以通过在springConfig配置类中添加@Import注解把该JdbcConfig类导入:
package org.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import javax.sql.DataSource;
//加载第三方bean
@Configuration
@ComponentScan("org.example.dao")
@Import(JdbcConfig.class)
public class springConfig {
}
@Import(JdbcConfig.class):用于导入第三方资源的信息条件,该注解只允许写一次,多个资源的话,用数组形式。
我们在main方法中获取bean时,需要先获取springConfig配置类,然后通过通过配置类获取bean
package org.example.main;
import org.example.config.springConfig2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
public class thirdPartyAnnotate {
public static void main(String[] args) {
ApplicationContext act=new AnnotationConfigApplicationContext(springConfig2.class);
//如果第三方数据库只有一个bean的话,可以省略前面引号中的bean的id值
//DataSource dataSource = act.getBean(DataSource.class);
DataSource dataSource = act.getBean("dataSource2",DataSource.class);
System.out.println(dataSource);
}
}