这个注解非常简单，就是标注当前组件是否为单例。单例，常见有两种方案：

* 实例级，是指每次获取实例时，会新构建实例。（默认）
* 方法级，是指每次获取调用方法时，会新构建实例。（需要借助手动代码实现，参考最后面）

### 1、默认为单实例

```java
@Component // 或 @Managed （v3.5 后支持）
public class UserDao{ }
```


### 2、标注为非单实例（多实例，每次获取或注入时会构建新的实例）

```java
@Singleton(false)
@Component // 或 @Managed （v3.5 后支持）
public class UserDao{ }
```

* 每次获取时，会构建新实例

```java
BeanWrap userDaoWrap = Solon.context().getWrap(UserDao.class)

UserDao userDao1 = userDaoWrap.get();
UserDao userDao2 = userDaoWrap.get(); // userDao2 != userDao1

//或者

UserDao userDao1 = Solon.context().getBean(UserDao.class);
UserDao userDao2 = Solon.context().getBean(UserDao.class); // userDao2 != userDao1
```

* 每次注入时，会构建新实例

```java
@Singleton(false)
@Controller
public class UserController{
    @Inject
    UserDao userDao1;
    
    @Inject
    UserDao userDao2; // userDao2 != userDao1
   
    @Mapping("/hello")
    public String hello(String name) {
        return name;
    }
}

//UserController 也是非单例，所以每次请求都会重新构建。
```

* 每次执行时，会构建新实例

```java
public class UserService {
    UserDao userDao(){
        return Solon.context().getBean(UserDao.class)
    }
   
    public void getUser(int userId){
        return userDao().selectById(userId)
    }
}
```